博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
11.3NOIP模拟赛
阅读量:4561 次
发布时间:2019-06-08

本文共 9615 字,大约阅读时间需要 32 分钟。

/*考虑贪心 把原序列排序后,对于原中位数往后所有比要更改到的值小的都改成它正确性显然。 */ #include
#include
#include
#define N 100007#define ll long longusing namespace std;ll n,m,ans,cnt;ll a[N],sum[N];inline ll read(){ ll x=0,f=1;char c=getchar(); while(c>'9'||c<'0'){
if(c=='0')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f;}int main(){ freopen("median.in","r",stdin); freopen("median.out","w",stdout); n=read();m=read(); if(m==0) {printf("0\n");return 0;} for(int i=1;i<=n;i++) a[i]=read(); int mid=n/2+1; sort(a+1,a+n+1); for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i]; int num=lower_bound(a+1,a+n+1,m)-a; if(num==n+1) ans=mid*m-(sum[n]-sum[mid-1]); else if(num==mid) ans=max(a[mid],m)-min(a[mid],m); else ans=(num-mid)*m-(sum[num-1]-sum[mid-1]); cout<
<

 

/*水水的dp 然而菜死了没想出正解QAQ */ #include
#include
#include
#include
#define N 3001#define ll long long#define mod 233333333using namespace std;ll n,m,k,p,ans,cnt,cur,res1,res2;ll f[N][N];inline ll read(){ ll x=0,f=1;char c=getchar(); while(c>'9'||c<'0'){
if(c=='0')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f;}void dfs(int now,int tot){ if(now && now-tot*2>=k) return; if(tot>n) return; if(now==n*2 && tot==n) { ans++;ans%=p; return; } dfs(now+1,tot);dfs(now+1,tot+1);}ll min_(ll a,ll b){
return a
60暴力

 

/*K=1显然是Catalan数考虑Catalan数的证明过程若数列不合法,则一定存在一个位置x,在这之前有m个+1,m + k个-1我们把之后的1变为-1,-1变为1则该序列含有N + K个-1, N个1方案数为C(2n, n + k)用总的减去即可*/#include
#include
#define LL intconst int MAXN = 2 * 1e6 + 10;inline int read(){ int x=0,f=1;char c=getchar(); while(c>'9'||c<'0'){
if(c=='0')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f;}int N, mod, prime[MAXN], vis[MAXN], tot, mn[MAXN], num[MAXN], K;void GetPhi(int N){ vis[1] = 1; for(int i = 2; i <= N; i++) { if(!vis[i]) prime[++tot] = i, mn[i] = tot; for(int j = 1; j <= tot && (i * prime[j] <= N); j++) { vis[i * prime[j]] = 1; mn[i * prime[j]] = j; if(!(i % prime[j])) break; } }}void insert(int x, int opt){ while(x != 1) num[mn[x]] += opt, x = x / prime[mn[x]];}int fastpow(int a, int p){ int base = 1; while(p) { if(p & 1) base = (1ll * base * a) % mod; a = (1ll * a * a) % mod; p >>= 1; } return base;}int FindAns(){ LL ans = 1; for(int i = 1; i <= tot; i++) if(num[i]) ans = (1ll * ans * fastpow(prime[i], num[i])) % mod; return ans;}main(){ N = read();K = read();mod = read(); GetPhi(2 * N); for(int i = N + 1; i <= 2 * N; i++) insert(i, 1); for(int i = 1; i <= N; i++) insert(i, -1); LL ans1 = FindAns(); memset(num, 0, sizeof(num)); for(int i = N + K + 1; i <= 2 * N; i++) insert(i, 1); for(int i = 1; i <= N - K; i++) insert(i, -1); LL ans2 = FindAns(); printf("%lld", (ans1 - ans2 + mod) % mod); return 0;}

 

 

#include
#include
#include
#include
#define N 200007#define M 500007#define inf 0x3f3f3f3fusing namespace std;int n,m,ans,cnt,top,num,S,T;int vis[N],val[N],head[N],val_[N],siz[N];int dfn[N],low[N],sta[N],scc[N],to[N];bool in_st[N];int dis[20][20],d[N];int Head[N];struct edge{ int u,v,nxt,w;}e[M],E[M];struct node{ int sum,x;};inline int read(){ int x=0,f=1;char c=getchar(); while(c>'9'||c<'0'){
if(c=='0')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f;}inline void add(int u,int v,int w){ e[++cnt].v=v;e[cnt].nxt=head[u];e[cnt].w=w;head[u]=cnt;}inline void Add(int u,int v,int w){ E[++cnt].v=v;E[cnt].nxt=Head[u];E[cnt].w=w;Head[u]=cnt;}void Tarjan(int u){ low[u]=dfn[u]=++cnt;sta[++top]=u;in_st[u]=1; for(int i=head[u];i;i=e[i].nxt) { int v=e[i].v; if(!dfn[v]) Tarjan(v),low[u]=min(low[u],low[v]); else if(in_st[v]) low[u]=min(low[u],dfn[v]); } int lol=0; if(low[u]==dfn[u]) { num++; while(u!=sta[top]) { lol++; if(sta[top]==S) to[num]=1; if(sta[top]==T) to[num]=2; in_st[sta[top]]=0;scc[sta[top]]=num;top--; } in_st[sta[top]]=0;scc[sta[top]]=num;top--; siz[num]=++lol; }}void bfs(){ queue
q;node u; while(!q.empty()) q.pop(); u.x=scc[S];u.sum=val_[scc[S]];vis[scc[S]]=1; q.push(u); while(!q.empty()) { u=q.front();q.pop(); if(u.x==scc[T]) ans=min(ans,u.sum); for(int i=Head[u.x];i;i=E[i].nxt) { int v=E[i].v;node tmp; tmp.sum=u.sum & E[i].w & val_[v];tmp.x=v; q.push(tmp); } }}int main(){ freopen("rabbit.in","r",stdin); freopen("rabbit.out","w",stdout); int x,y,z;memset(dis,127/3,sizeof dis); n=read();m=read();S=read();T=read(); for(int i=1;i<=n;i++) val[i]=read(); for(int i=1;i<=m;i++) { x=read();y=read();z=read(); add(x,y,z); }cnt=0;ans=inf; for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i); for(int i=1;i<=num;i++) for(int j=1;j<=n;j++) { if(scc[j]==i) { if(siz[j]==1) val_[i]=val[j]; else { for(int x=head[j];x;x=e[x].nxt) if(scc[e[x].v]==num) val_[scc[j]]&=val[j]&val[e[x].v]&e[j].w; } } } cnt=0; for(int i=1;i<=n;i++) { for(int j=head[i];j;j=e[j].nxt) { if(scc[i]!=scc[e[j].v]) Add(scc[i],scc[e[j].v],e[j].w); } } bfs(); printf("%d\n",ans); return 0; return 0;}
10分蜜汁WA的暴力

std可能有锅?

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long#define M 700010struct Edge { int vi, vj, v;} edge[M];struct Note { int vj, v, id;} be;using namespace std;int read() { int nm = 0, f = 1; char c = getchar(); for(; !isdigit(c); c = getchar()) if(c == '-') f = -1; for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0'; return nm * f;}vector
to[M];vector
to1[M], to2[M];int belong[M], st[M], dfn[M], low[M], dft, n, m, s, t, note[M], noww[M], tp, tot, sz[M], ans = 2147483647, rudu1[M], rudu2[M];bool vis[M];void tarjan(int now) { vis[now] = true; st[++tp] = now; dfn[now] = low[now] = ++dft; for(int i = 0; i < to[now].size(); i++) { int vj = to[now][i]; if(!dfn[vj]) { tarjan(vj); low[now] = min(low[now], low[vj]); } else if(vis[vj]) low[now] = min(low[now], dfn[vj]); } if(dfn[now] == low[now]) { tot++; while(st[tp] != now) { int x = st[tp]; vis[x] = false; noww[tot] &= note[x]; belong[x] = tot; tp--; } int x = st[tp]; vis[x] = false; noww[tot] &= note[x]; belong[x] = tot; tp--; }}bool can[M], tmp1[M], tmp2[M];int note1[M], note2[M], tp1, tp2;void tuopu() { queue
q; q.push(belong[t]); while(!q.empty()) { int op = q.front(); q.pop(); for(int i = 0; i < to2[op].size(); i++) { int vj = to2[op][i].vj; rudu2[vj]++; if(!vis[vj]) q.push(vj), vis[vj] = true; } } while(!q.empty()) q.pop(); q.push(belong[s]); while(!q.empty()) { int op = q.front(); note1[++tp1] = op; q.pop(); for(int i = 0; i < to1[op].size(); i++) { int vj = to1[op][i].vj; rudu1[vj]--; if(rudu1[vj] == 0) q.push(vj); } } q.push(belong[t]); while(!q.empty()) { int op = q.front(); q.pop(); note2[++tp2] = op; for(int i = 0; i < to2[op].size(); i++) { int vj = to2[op][i].vj; rudu2[vj]--; if(rudu2[vj] == 0) q.push(vj); } }}void work(int x) { for(int i = 1; i <= tot; i++) tmp1[i] = tmp2[i] = false; if((noww[belong[s]] & x) == 0) tmp1[belong[s]] = true; for(int i = 1; i <= tp1; i++) { int op = note1[i]; for(int j = 0; j < to1[op].size(); j++) { be = to1[op][j]; if((tmp1[op] == true) || (can[be.id] && ((be.v & x) == 0))) { tmp1[be.vj] = true; tmp1[be.id] = true; } else if((noww[be.vj] & x) == 0 && (can[be.vj])) tmp1[be.vj] = true; } } if((noww[belong[t]] &x) == 0) tmp2[belong[t]] = true; for(int i = 1; i <= tp2; i++) { int op = note2[i]; for(int j = 0; j < to2[op].size(); j++) { be = to2[op][j]; if((tmp2[op] == true) || (can[be.id] && ((be.v & x) == 0))) { tmp2[be.vj] = true; tmp2[be.id] = true; } else if((noww[be.vj] & x) == 0 && (can[be.vj])) tmp2[be.vj] = true; } } for(int i = 1; i <= tot; i++) tmp1[i] = (tmp1[i] | tmp2[i]); if(tmp1[belong[s]] && tmp1[belong[t]]) ans -= x; else return; for(int i = 1; i <= tot; i++) can[i] = (can[i] & tmp1[i]);}int main() { freopen("rabbit.in", "r", stdin); freopen("rabbit.out", "w", stdout); cin >> n >> m >> s >> t; for(int i = 1; i <= n; i++) note[i] = read(), noww[i] = 2147483647; for(int i = 1; i <= m; i++) { int vi = read(), vj = read(), v = read(); edge[i].vi = vi, edge[i].vj = vj, edge[i].v = v; to[vi].push_back(vj); } tarjan(s); if(!dfn[t]) { puts("-1"); return 0; } for(int i = 1; i <= m; i++) { int vi = edge[i].vi, vj = edge[i].vj, v = edge[i].v; vi = belong[vi], vj = belong[vj]; if(vi == 0 || vj == 0) continue; if(vi == vj) noww[vi] &= v; else { be.id = ++tot; be.vj = vj; be.v = v; to1[vi].push_back(be); rudu1[vj]++; be.vj = vi; to2[vj].push_back(be); } } if(belong[s] == belong[t]) { cout << noww[belong[s]] << "\n"; return 0; } tuopu(); for(int i = 1; i <= tot; i++) can[i] = true; for(int i = 30; i >= 0; i--) work(1 << i); cout << ans << "\n"; return 0;}
std

 

转载于:https://www.cnblogs.com/L-Memory/p/9901123.html

你可能感兴趣的文章
LOJ#137. 最小瓶颈路 加强版(Kruskal重构树 rmq求LCA)
查看>>
51nod 1597 有限背包计数问题 (背包 分块)
查看>>
洛谷P2345 奶牛集会
查看>>
C# webapi 路由规则和接收数据
查看>>
HDU 1851 (巴什博奕 SG定理) A Simple Game
查看>>
UVa (BFS) The Monocycle
查看>>
CodeForces 568B DP Symmetric and Transitive
查看>>
多层iframe的页面取子标签
查看>>
centos安装redis
查看>>
Linux 磁盘
查看>>
optional install error: Package require os(darwin) not compatible with your platform(win32)
查看>>
mvc未登录跳转到登录界面
查看>>
seajs 常用模块 下载
查看>>
数据结构与算法2-4 堆栈链式存储
查看>>
springboot+elasticsearch实现全局检索
查看>>
JAVA API 1.8版本文档下载( 百度网盘 )
查看>>
羊车门问题
查看>>
Java ZIP压缩和解压缩文件(解决中文文件名乱码问题)
查看>>
JSON
查看>>
多表联动筛选VBA
查看>>