1. 程式人生 > 其它 >10.4模擬賽

10.4模擬賽

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 inline int re_ad() {
 4     char ch=getchar(); int x=0,f=1;
 5     while(ch<'0' || '9'<ch) { if(ch=='-') f=-1; ch=getchar(); }
 6     while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
 7     return x*f;
8 } 9 10 const int N=2e5+11,St=1e5; 11 int n,ans,sum[N],lst[N]; 12 13 int main() 14 { 15 16 n=re_ad(); lst[0+St]=0; 17 for(int i=1,x;i<=n;++i) { 18 x=re_ad(),x=!x?-1:1,sum[i]=sum[i-1]+x; 19 if(!lst[sum[i]+St] && sum[i]!=0) lst[sum[i]+St]=i; 20 else ans=max(ans,i-lst[sum[i]+St]);
21 } 22 printf("%d\n",ans); 23 return 0; 24 }
 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 inline ll re_ad() {
 5     char ch=getchar(); ll x=0,f=1;
 6     while(ch<'0' || '9'<ch) { if(ch=='-') f=-1; ch=getchar(); }
 7     while('0'<=ch && ch<='
9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); 8 return x*f; 9 } 10 11 const ll N=1e6+11,L=31; 12 ll n,m,ans,lens,lent,mem[L]; 13 char s[N],t[N]; 14 ll gcd(ll x,ll y) { return !y?x:gcd(y,x%y); } 15 16 int main() 17 { 18 scanf("%lld%lld",&n,&m); 19 scanf("%s",s+1); lens=strlen(s+1); 20 scanf("%s",t+1); lent=strlen(t+1); 21 ll g=gcd(lens,lent),gs=lens/g,gt=lent/g; 22 // printf("%lld %lld %lld\n",g,gs,gt); 23 for(ll i=1;i<=g;++i) { 24 memset(mem,0,sizeof(mem)); 25 for(ll j=i;j<=lens;j+=g) ++mem[s[j]-'a']; 26 for(ll j=i;j<=lent;j+=g) ans+=mem[t[j]-'a']; 27 // printf("%lld\n",ans); 28 } 29 n/=gt,m/=gs,ans*=n; 30 printf("%lld\n",ans); 31 return 0; 32 }
 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 inline ll re_ad() {
 5     char ch=getchar(); ll x=0,f=1;
 6     while(ch<'0' || '9'<ch) { if(ch=='-') f=-1; ch=getchar(); }
 7     while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
 8     return x*f;
 9 }
10 
11 const ll N=1e5+11;
12 ll n,m,a[N],Maxx,sum[N];
13 ll ht[N],L[N],R[N];
14 inline ll Get_Highest() {
15     ll lj=0,res=0;
16     for(ll i=1;i<=n;++i) lj=max(lj+1,a[i]),ht[i]=lj;
17     lj=0; for(ll i=n;i>=1;--i) lj=max(lj+1,a[i]),res=max(res,min(ht[i],lj));
18     return res;
19 }
20 
21 inline bool Check(ll d) {
22     ll qsum=0;
23     memset(L,0,sizeof(L)),memset(R,0,sizeof(R));
24     for(ll i=n,lj=n;i>=1;--i) {
25         while(d-a[lj]>i-lj && lj>=1) --lj;
26         L[i]=lj;
27     }
28     for(ll i=1,lj=1;i<=n;++i) {
29         while(d-a[lj]>lj-i && lj<=n) ++lj;
30         R[i]=lj;
31     }
32 //    puts(""); printf("%lld: \n",d);
33 //    printf("L: "); for(ll i=1;i<=n;++i) printf("%lld ",L[i]); puts("");
34 //    printf("R: "); for(ll i=1;i<=n;++i) printf("%lld ",R[i]); puts("");
35     for(ll i=1;i<=n;++i) {
36         if(L[i]<1 || R[i]>n) continue;
37         ll x=i-L[i],y=R[i]-i-1;
38         ll xx=x*d-x*(x-1)/2-sum[i]+sum[L[i]];
39         ll yy=y*d-y*(y-1)/2-sum[R[i]-1]+sum[i];
40 //        printf("%lld: %lld %lld %lld %lld\n",i,x,y,xx,yy);
41         if(xx+yy<=m) return true;
42     }
43     return false;
44 }
45 
46 int main()
47 {
48     n=re_ad(),m=re_ad();
49     for(ll i=1;i<=n;++i) a[i]=re_ad();
50     for(ll i=1;i<=n;++i) sum[i]=sum[i-1]+a[i],Maxx=max(Maxx,a[i]);
51     ll l=Maxx+1,r=Get_Highest(),ans=Maxx;
52 //    printf("l,r: %lld %lld\n",l,r);
53     while(l<=r) {
54         ll mid=(l+r)>>1;
55         if(Check(mid)) l=mid+1,ans=mid;
56         else r=mid-1;
57     }
58     printf("%lld\n",ans);
59     return 0;
60 }
 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 inline ll re_ad() {
 5     char ch=getchar(); ll x=0,f=1;
 6     while(ch<'0' || '9'<ch) { if(ch=='-') f=-1; ch=getchar(); }
 7     while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
 8     return x*f;
 9 }
10  
11 const ll N=3e5+11,M=6e5+11;
12 ll n,a[N],dp[N][3],son[N],ans[N];
13 ll to[M],nxt[M],w[M],edge,head[N];
14 inline void addedge(ll x,ll y,ll z) {
15     ++edge,to[edge]=y,nxt[edge]=head[x],w[edge]=z,head[x]=edge;
16     ++edge,to[edge]=x,nxt[edge]=head[y],w[edge]=z,head[y]=edge;
17 }
18  
19 void dfs1(ll d,ll f) {
20     dp[d][0]=a[d];
21     for(ll i=head[d],u;i;i=nxt[i]) {
22         u=to[i]; if(u==f) continue;
23         dfs1(u,d);
24         dp[d][0]+=max(dp[u][0]-w[i]*2,0ll);
25         ll els=dp[u][0]-max(dp[u][0]-w[i]*2,0ll);
26         ll t=dp[u][1]-w[i]+els;
27         if(t>dp[d][1]) dp[d][2]=dp[d][1],dp[d][1]=t,son[d]=u;
28         else if(t>dp[d][2]) dp[d][2]=t;
29     }
30 }
31 void dfs2(ll d,ll f) {
32     for(ll i=head[d],u;i;i=nxt[i]) {
33         u=to[i]; if(u==f) continue;
34         ll tmp=dp[d][0]-w[i]*2;
35         ll tu=max(dp[u][0]-w[i]*2,0ll);
36         dp[u][0]+=max(tmp-tu,0ll);
37         tmp=min(tmp-tu,0ll);
38         ll t=tmp+dp[d][(son[d]==u)+1]+w[i];
39         if(t>dp[u][1]) dp[u][2]=dp[u][1],dp[u][1]=t,son[u]=d;
40         else if(t>dp[u][2]) dp[u][2]=t;
41         dfs2(u,d);
42     }
43 }
44  
45 int main()
46 {
47     n=re_ad();
48     for(ll i=1,x,y,z;i<n;++i) x=re_ad(),y=re_ad(),z=re_ad(),addedge(x,y,z);
49     for(ll i=1;i<=n;++i) a[i]=re_ad();
50     dfs1(1,0); dfs2(1,0);
51     for(ll i=1;i<=n;++i) printf("%lld\n",dp[i][0]+dp[i][1]);
52     return 0;
53 }