11.7NOIP模擬賽
阿新 • • 發佈:2018-11-07
、、
/* 考慮模gcd(n,m,k)的一個剩餘系 然後檢查是否每類中都有一個快樂的人. */ #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #define ll long long using namespace std; ll n,m,k,a1,b1,c1,vis[100010]; ll read() { ll n=0,f=1;charc=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){n=n*10+c-'0';c=getchar();} return n*f; } ll gcd(ll a,ll b) { if(b==0)return a; return gcd(b,a%b); } int main() { freopen("happy2.in","r",stdin); freopen("happy2.out","w",stdout); ll T=read(); while(T--) { memset(vis,0,sizeof(vis)); n=read(),m=read(),k=read(); ll gc=gcd(gcd(n,m),k); a1=read(); for(int i=1;i<=a1;++i)vis[read()%gc]=1; b1=read(); for(int i=1;i<=b1;++i)vis[read()%gc]=1; c1=read(); for(int i=1;i<=c1;++i)vis[read()%gc]=1; int c=1; for(int i=0;i<gc;++i) if(!vis[i]) { c=0; break; } if(!c||a1+b1+c1==0)cout<<"No\n"; else cout<<"Yes\n"; } return 0; }
/* 注意別讀錯題,是大於等於p! */ #include<iostream> #include<cstdio> #include<cstring> #define N 3001 #define ll long long using namespace std; ll n,m,cnt; ll ans; ll pos[N*100],pos_[N][N]; struct node{ ll x,y; }p[N*100]; inline ll read() { int x=0,f=1;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int main() { freopen("suspect.in","r",stdin); freopen("suspect.out","w",stdout); ll x,y; n=read();m=read(); if(m==0) { cnt=0; for(int i=1;i<=n;i++) { x=read();y=read(); pos[x]++;pos[y]++; } ans=1ll*(n-1)*n/2; } else if(m==1) { cnt=0; for(int i=1;i<=n;i++) { x=read();y=read(); pos[x]++;pos[y]++; } for(int i=1;i<=n;i++) if(pos[i]==0) cnt++; ans=(n-1)*n/2-(cnt-1)*cnt/2; } else { for(int i=1;i<=n;i++) { x=read();y=read(); pos[x]++;pos[y]++;pos_[x][y]++,pos_[y][x]++; } for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if(pos[i]+pos[j]-pos_[i][j]>=m) ans++; } cout<<ans<<endl; fclose(stdin);fclose(stdout); return 0; }80暴力
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<stack> #include<cstdlib> #define INF 100000000 using namespace std; typedef long long LL; struct Edge { int from,to,pre; }e[1000000]; int h[300005]={0},cou=0; int c[300005],ed[300005]; void Addedge(int from,int to) { cou++; e[cou]=((Edge){from,to,h[from]}); h[from]=cou; } inline void update(int x) { if(x==0) { c[0]++; return; } for(;x<=300000;x+=x&-x) c[x]++; } inline int get(int x) { if(x==-1) return 0; int sum=0; for(;x;x-=x&-x) sum+=c[x]; return sum+c[0]; } int main() { freopen("suspect.in","r",stdin); freopen("suspect.out","w",stdout); LL ans=0; int sum,i,n,p,a,b,v,j; cin>>n>>p; for(i=1;i<=n;i++) { scanf("%d%d",&a,&b); Addedge(a,b); Addedge(b,a); ed[a]++; ed[b]++; } for(i=1;i<=n;i++) update(ed[i]); for(i=1;i<=n;i++) { if(ed[i]>=p) ans+=n-1; else { sum=n-get(p-ed[i]-1); if(ed[i]>=p-ed[i]) sum--; for(j=h[i];j;j=e[j].pre) { v=e[j].to; if(ed[v]==p-ed[i]) sum--; ed[v]--; } for(j=h[i];j;j=e[j].pre) { v=e[j].to; ed[v]++; } ans+=sum; } } cout<<ans/2<<endl; return 0; }
/* 80暴力。by lpy 怕不是資料結構學傻了。考試寫的線段樹。還忘了離散化,掛25分。 */ #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m; int sum[1010][1010]; int sum0[300010],sum1[300010]; int a[300010],b[300010],num[300010]; inline int read() { int x=0,f=1;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int main() { freopen("xor.in","r",stdin); freopen("xor.out","w",stdout); n=read(); int num1=0; for(int i=1; i<=n; i++) { scanf("%d",&a[i]); b[i]=a[i]; if(a[i]<=1) num1++; } sort(b+1,b+1+n); int bnum=unique(b+1,b+1+n)-b-1; if(bnum==n) { m=read(); for(int i=1; i<=m; i++) { int l=read(); int r=read(); puts("0"); } } else if(num1==n) { for(int i=1; i<=n; i++) { if(a[i]==1) { sum0[i]=sum0[i-1]; sum1[i]=sum1[i-1]+1; } if(a[i]==0) { sum1[i]=sum1[i-1]; sum0[i]=sum0[i-1]+1; } } m=read(); for(int i=1; i<=m; i++) { int l=read(); int r=read(); int xx=sum1[r]-sum1[l-1]; int yy=sum0[r]-sum0[l-1]; if(xx%2==0&&yy%2==0&&xx!=0&&yy!=0) puts("1"); else if(xx%2==0&&xx!=0) puts("1"); else if(yy%2==0&&yy!=0) puts("0"); else puts("0"); } } else if(n<=1000) { for(int i=1; i<=n; i++) { int x=a[i]; a[i]=lower_bound(b+1,b+1+bnum,a[i])-b; num[a[i]]=x; } for(int i=1; i<=n; i++) for(int j=1; j<=bnum; j++) { if(a[i]==j) sum[i][j]=sum[i-1][j]+1; else sum[i][j]=sum[i-1][j]; } m=read(); for(int i=1; i<=m; i++) { int l=read();int r=read(); int ans=0; for(int j=1; j<=bnum; j++) { int xx=sum[r][j]-sum[l-1][j]; if(xx%2==0&&xx!=0) ans=ans^num[j]; } printf("%d\n",ans); } } }80暴力
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<stack> #include<cstdlib> #include<string> #include<bitset> #include<iomanip> #include<deque> #include<utility> #define INF 1000000000 #define fi first #define se second #define N 1000005 #define P 1000000007 #define debug(x) cerr<<#x<<"="<<x<<endl #define MP(x,y) make_pair(x,y) using namespace std; typedef long long LL; typedef pair<int,int> pii; int c[N],now,sum,a[N],b[N],ans[N],nxt[N],n; map<int,int> vis,pre; vector<pii> Q[N]; void Add(int x,int w) { for(;x<=n;x+=x&-x) c[x]^=w; } int Get(int x) { int s=0; for(;x;x-=x&-x) s^=c[x]; return s; } int main() { int i,m,ql,qr,j; freopen("xor.in","r",stdin); freopen("xor.out","w",stdout); cin>>n; now=0; for(i=1;i<=n;i++) { scanf("%d",&a[i]); vis[a[i]]++; nxt[pre[a[i]]]=i; pre[a[i]]=i; if(vis[a[i]]>1) now^=a[i]; b[i]=now; //debug(b[i]); } cin>>m; for(i=1;i<=m;i++) { scanf("%d%d",&ql,&qr); Q[ql].push_back(MP(qr,i)); } for(i=1;i<=n;i++) { //debug(sum); for(j=0;j<Q[i].size();j++) ans[Q[i][j].se]=Get(Q[i][j].fi)^b[Q[i][j].fi]; ql=nxt[i]; if(ql) { sum^=a[i]; Add(ql,a[i]); } } for(i=1;i<=m;i++) printf("%d\n",ans[i]); return 0; }
應付了一篇解題報告~