A:水题
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define C 0.5772156649 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #define pil pair<int,ll> #define pii pair<int,int> #define ull unsigned long long #define base 1000000000000000000 #define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-12; const int N=(1<<15)+10,maxn=400000+10,inf=0x3f3f3f3f; string s; int main() { int n,m; cin>>n>>m; bool w=1; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cin>>s; if(s=="C"||s=="M"||s=="Y")w=0; } } if(w)puts("#Black&White"); else puts("#Color"); return 0; } /******************** ********************/
B:与环相连的点找一下就好了
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define C 0.5772156649 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #define pil pair<int,ll> #define pii pair<int,int> #define ull unsigned long long #define base 1000000000000000000 #define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-12; const int N=100000+10,maxn=400000+10,inf=0x3f3f3f3f; vector<pii>v[N]; int a[N]; int ok[N]; int main() { int n,m,k; scanf("%d%d%d",&n,&m,&k); for(int i=0;i<m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); v[a].pb(mp(b,c)); v[b].pb(mp(a,c)); } int ans=1e9+10; for(int i=1;i<=k;i++) { scanf("%d",&a[i]); ok[a[i]]=1; } // puts("++++"); for(int i=1;i<=k;i++) { for(int j=0;j<v[a[i]].size();j++) { pii te=v[a[i]][j]; if(!ok[te.fi])ans=min(ans,te.se); } } if(ans>=1e9+10)puts("-1"); else printf("%d\n",ans); return 0; } /******************** ********************/
C:题意:给你一个数,找其他两个数构成勾股数
题解:通过找规律可以看出对于任一素数x,和(x*x-1)/2,(x*x-1)/2+1可以构成勾股数,那么可以通过分解素数,但是2的倍数不行,但是我们可以通过3,4,5来解决
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define C 0.5772156649 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #define pil pair<int,ll> #define pii pair<int,int> #define ull unsigned long long #define base 1000000000000000000 #define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-12; const int N=100000+10,maxn=400000+10,inf=0x3f3f3f3f; int main() { fio; ll n; cin>>n; ll res=n; for(ll i=2;i*i<=res;i++) { if(res%i==0) { while(res%i==0)res/=i; if(i!=2) { ll te=(i*i-1)/2; cout<<n/i*te<<" "<<n/i*(te+1)<<"\n"; return 0; } } } if(res>1&&res!=2) { ll te=(res*res-1)/2; cout<<n/res*te<<" "<<n/res*(te+1)<<"\n"; return 0; } if(n%4==0) { printf("%lld %lld\n",n/4*3,n/4*5); return 0; } puts("-1"); return 0; } /******************** ********************/
D:题意:n个数,四种操作,1如果这个地方没放过书,那就放上,2如果放过书就拿掉,3把一排书取过的拿走,没有的放上,4回到操作x
题解:很直观的主席树,主要是区间操作有点麻烦,我们可以用标记永久化,lazy是翻转标记,没有query,直接输出sum【rt【x】】即可,但是更新的时候就需要把这一段经过的lazy标记全部记下来,需要注意的是,以前的主席树修改操作,我都是直接修改标号的,但是这题会有修改修改操作,会有覆盖,所有就要不修改,直接把rt【i】复制成rt【x】,那么访问的时候就会指向rt【x】
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define C 0.5772156649 //#define ls l,m,rt<<1 //#define rs m+1,r,rt<<1|1 #define pil pair<int,ll> #define pii pair<int,int> #define ull unsigned long long #define base 1000000000000000000 #define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-12; const int N=1000000+10,maxn=400000+10,inf=0x3f3f3f3f; int tot,ls[N*20],rs[N*20],rt[N],sum[N*20],lazy[N*20]; int oper[N]; void build(int &o,int l,int r) { o=++tot; sum[o]=lazy[o]=0; if(l==r)return ; int m=(l+r)>>1; build(ls[o],l,m); build(rs[o],m+1,r); } void update(int &o,int filp,int l,int r,int last,int L,int R,int op) { o=++tot; ls[o]=ls[last]; rs[o]=rs[last]; sum[o]=sum[last]; lazy[o]=lazy[last]; //printf("%d %d\n",l,r); if(L<=l&&r<=R) { if(op==1) { // printf("+++++%d\n",sum[o]^filp^lazy[o]); if(!(sum[o]^filp^lazy[o]))lazy[o]^=1; } else if(op==2) { if(sum[o]^filp^lazy[o])lazy[o]^=1; } else if(op==3)lazy[o]^=1; return ; } int m=(l+r)>>1; if(L<=m)update(ls[o],filp^lazy[o],l,m,ls[last],L,R,op); if(m<R)update(rs[o],filp^lazy[o],m+1,r,rs[last],L,R,op); sum[o]=0; if(lazy[ls[o]])sum[o]+=m-l+1-sum[ls[o]]; else sum[o]+=sum[ls[o]]; if(lazy[rs[o]])sum[o]+=r-m-sum[rs[o]]; else sum[o]+=sum[rs[o]]; // printf("%d###%d###%d\n",l,r,sum[o]); } int main() { tot=0; int n,m,q; scanf("%d%d%d",&n,&m,&q); build(rt[0],1,n*m); int cnt=0; for(int i=1;i<=q;i++) { int op; scanf("%d",&op); cnt++; if(op==1) { int x,y; scanf("%d%d",&x,&y); update(rt[cnt],0,1,n*m,rt[cnt-1],(x-1)*m+y,(x-1)*m+y,1); // printf("\n!!!%d\n",(x-1)*m+y); } else if(op==2) { int x,y; scanf("%d%d",&x,&y); update(rt[cnt],0,1,n*m,rt[cnt-1],(x-1)*m+y,(x-1)*m+y,2); // printf("\n!!!%d\n",(x-1)*m+y); } else if(op==3) { int x; scanf("%d",&x); update(rt[cnt],0,1,n*m,rt[cnt-1],(x-1)*m+1,x*m,3); // printf("\n%d-----%d\n",(x-1)*m+1,x*m); } else { int x; scanf("%d",&x); rt[cnt]=rt[x]; } if(lazy[rt[cnt]])printf("%d\n",n*m-sum[rt[cnt]]); else printf("%d\n",sum[rt[cnt]]); } return 0; } /******************** 19 16 14 2 11 2 1 16 3 1 16 3 3 13 1 13 3 4 9 1 5 11 3 1 ********************/