1004 DP
#include<bits/stdc++.h>
using namespace std;
#define N 100000
int ch[N+10],sh[N+10],uh[N+10],mh[N+10];
int main(){
int T;
scanf("%d",&T);
while(T--){
memset(ch,0,sizeof(ch));
memset(sh,0,sizeof(sh));
memset(uh,0,sizeof(uh));
memset(mh,0,sizeof(mh));
int n,p;
sh[0]=0;
scanf("%d%d",&n,&p);
for(int i=1;i<=n;i++){
scanf("%d",ch+i);
sh[i]=(sh[i-1]+ch[i])%p;
}
uh[0]=0;
for(int i=1;i<=n;i++){
int u=sh[i];
if(u==0){
int t=uh[u];
mh[i]=max(mh[t]+1,mh[i-1]);
uh[u]=i;
}
else{
int t=uh[u];
if(t==0){
uh[u]=i;
mh[i]=mh[i-1];
}
else{
int y=uh[u];
uh[u]=i;
mh[i]=max(mh[y]+1,mh[i-1]);
}
}
}
printf("%d\n",mh[n]);
}
}
1005 并查集,公式
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef pair<ll, ll> pll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
const int INF = 0x3f3f3f3f;
ll qpow(ll base, ll n){ll ans = 1; while (n){if (n & 1) ans = ans * base % mod; base = base * base % mod; n >>= 1;} return ans;}
ll gcd(ll a, ll b){return b ? gcd(b, a % b) : a;}
ll a[N][2];
int fa[N];
int find(int x){
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
int main()
{
int t;
cin >> t;
ll inv2 = qpow(2, mod - 2);
ll inv6 = qpow(6, mod - 2);
while (t --){
int n;
scanf("%d", &n);
ll num1 = 0, num2 = 0, x;
for(int i = 1; i <= n; ++ i) {
scanf("%lld", &x);
if (x == 1) ++ num1;
else ++ num2;
-- x;
a[i][x] = 1;
a[i][x ^ 1] = 0;
fa[i] = i;
}
ll ans = num2 * (num2 - 1) % mod * inv2 % mod * num1 % mod;
ans = (ans + num2 * (num2 - 1) % mod * (num2 - 2) % mod * inv6 % mod) % mod;
printf("%lld\n", ans);
int u, v;
for (int i = 1; i < n; ++ i) {
scanf("%d %d", &u, &v);
u = find(u);
v = find(v);
if (u == v) continue;
ll res = 0;
ll lef1 = num1 - a[u][0] - a[v][0];
ll lef2 = num2 - a[u][1] - a[v][1];
ll lef3 = (lef1 + lef2) % mod;
res = (res + a[u][0] * a[v][1] % mod * lef2 % mod) % mod;
res = (res + a[u][1] * a[v][0] % mod * lef2 % mod) % mod;
res = (res + a[u][1] * a[v][1] % mod * lef3 % mod) % mod;
ans = (ans - res + mod) % mod;
printf("%lld\n", ans);
fa[v] = u;
a[u][0] += a[v][0];
a[u][1] += a[v][1];
}
}
return 0;
}
1009 贪心
#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define INF 0x3f3f3f3f
#define pi 3.141592654
typedef long long ll;
const int N = 1e5+5;
char s[N];
int pos[N];
int main(){
int t;scanf("%d",&t);
while(t--){
scanf("%s",s);
int l = strlen(s),f=1;
int num1=0,num2=0,cnt=0,tot=0;
for(int i = 0 ; i < l ; i++){
if(s[i] == '(') num1++;
else if(s[i] == '*'){
num2++;pos[++cnt] = i;
}
else{
if(num1>0) num1 --;
else if(num2>0){
num2--;
s[pos[++tot]] = '(';
}
else{
f=0;break;
}
}
}
if(!f){ printf("No solution!\n");continue;}
if(num1>0){
num1=0,num2=0,cnt=0,tot=0;
for(int i = l-1 ; i>=0 ; i--){
if(s[i] == '*'){
num2++,pos[++cnt] = i;
}else if(s[i] == ')'){
num1++;
}
else if(s[i] == '('){
if(num1>0) num1 --;
else if(num2>0){
num2--;
s[pos[++tot]] = ')';
}
else{
f=0;break;
}
}
}
}
if(!f) printf("No solution!\n");
else{
for(int i = 0 ; i < l ; i++){
if(s[i] =='*') continue;
printf("%c",s[i]);
}printf("\n");
}
}
return 0;
}