多校冲刺 noip 11.05
多校冲刺 noip 11.05
关于这场比赛,它死了......
你见过改题改到分数比考场上还低嘛??
我成功的做到了\(348->336\),我真牛逼
所以最后一个题是真的调不出来,我还是弃掉了
T1 回文
直接\(DP\),经典的坐标\(DP\)
AC_code
#include<bits/stdc++.h>
using namespace std;
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
const int N=505;
const int mod=993244853;
int n,m;
char s[N][N];
int f[N][N][N],ans;
signed main(){
freopen("palin.in","r",stdin);
freopen("palin.out","w",stdout);
// cout<<(sizeof(f)>>20)<<endl;
scanf("%d%d",&n,&m);
fo(i,1,n)scanf("%s",s[i]+1);
if(s[1][1]==s[n][m])f[0][0][0]=1;
else {printf("0");return 0;}
fo(i,1,(n+m-2)>>1){
fo(j,max(0,i-m+1),min(i,n-1))fo(k,max(0,i-m+1),min(i,n-1)){
if(s[1+j][1+i-j]!=s[n-k][m-i+k])continue;
if(i-1-j<=m-1&&j<i&&i-1-k<=m-1&&k<i)f[i][j][k]=(f[i][j][k]+f[i-1][j][k])%mod;
if(i-1-j<=m-1&&j<i&&k)f[i][j][k]=(f[i][j][k]+f[i-1][j][k-1])%mod;
if(j&&i-1-k<=m-1&&k<i)f[i][j][k]=(f[i][j][k]+f[i-1][j-1][k])%mod;
if(j&&k)f[i][j][k]=(f[i][j][k]+f[i-1][j-1][k-1])%mod;
}
}
fo(i,1,n){
int j=((n+m-2)>>1)-(i-1)+1;
if(j<=0||j>m)continue;
ans=(ans+f[(n+m-2)>>1][i-1][n-i])%mod;
if(((n+m)&1)&&i!=n)ans=(ans+f[(n+m-2)>>1][i-1][n-i-1])%mod;
}
printf("%d",ans);
return 0;
}
T2 快速排序
找规律发现:是\(nan\)的就直接输出,数字的话把它后面比他小的拿过来一起输出
AC_code
#include<bits/stdc++.h>
using namespace std;
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
const int N=5e5+5;
int T,n,a[N];
int lsh[N],lh;
int s[N],t[N],las;
signed main(){
freopen("qsort.in","r",stdin);
freopen("qsort.out","w",stdout);
scanf("%d",&T);
while(T--){
lh=0;
scanf("%d",&n);
fo(i,1,n){
char w=getchar();
bool fl=false;a[i]=0;
while(w<'0'||w>'9'){
if(w=='n'){
getchar();getchar();
fl=true;break;
}
w=getchar();
}
if(fl)continue;
while(w>='0'&&w<='9')a[i]=(a[i]<<3)+(a[i]<<1)+w-'0',w=getchar();
if(a[i])lsh[++lh]=a[i];
}
sort(lsh+1,lsh+lh+1);las=0;
fo(i,1,n){
if(a[i]==0)printf("nan ");
else if(a[i]<=lsh[las])continue;
else {
int pos=lower_bound(lsh+1,lsh+lh+1,a[i])-lsh;
fo(j,las+1,pos)printf("%d ",lsh[j]);
lsh[pos]--;las=pos;
}
}
printf("\n");
}
return 0;
}
T3 混乱邪恶
考场上迷迷糊糊的证出来一定有解,竟然是对的!!
我认为我无法讲清楚这个证明了,我只会口胡
算了,我连口胡都懒得,因为调下一题调的脑瓜子疼
checker
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
const int N=1e6+5;
int n,m,a[N],b[N],sum;
signed main(){
FILE *f1=fopen("chaoticevil.in","r");
FILE *f2=fopen("chaoticevil.out","r");
fscanf(f1,"%lld%lld",&n,&m);
fo(i,1,n)fscanf(f1,"%lld",&a[i]);
fo(i,1,n)fscanf(f2,"%lld",&b[i]),sum+=a[i]*b[i];
if(sum==0)printf("AC");
else printf("%lld",sum);
return 0;
}
AC_code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
const int N=1e6+5;
int n,m;
struct node{
int val,id,ans;
bool operator < (node a)const{
return val<a.val;
}
}a[N];
bool com(node a,node b){return a.id<b.id;}
vector<int> vec[N];
int mx,sum;
signed main(){
freopen("chaoticevil.in","r",stdin);
freopen("chaoticevil.out","w",stdout);
scanf("%lld%lld",&n,&m);
fo(i,1,n)scanf("%lld",&a[i].val),a[i].id=i;
printf("NP-Hard solved\n");
sort(a+1,a+n+1);
for(int i=1+(n&1);i<=n;i+=2){
sum+=a[i+1].val-a[i].val;
vec[a[i+1].val-a[i].val].push_back(i);
a[i].ans=-1;a[i+1].ans=1;
}
if(n&1)sum-=a[1].val,a[1].ans=-1;
fu(i,m/3,1){
if(!vec[i].size()||sum<i*2)continue;
for(auto x:vec[i]){
if(sum>=i*2)sum-=i*2,swap(a[x].ans,a[x+1].ans);
}
}
sort(a+1,a+n+1,com);
fo(i,1,n)printf("%lld ",a[i].ans);
return 0;
}
T4 cnmdSB题
祭奠一下我死去的\(10.2K\)的代码,极其壮观,已格式化
has dead
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fo(i, x, y) for (int i = (x); i <= (y); i++)
#define fu(i, x, y) for (int i = (x); i >= (y); i--)
const int N = 4e5 + 5;
int n, q;
int rt, lson[N], rson[N], fa[N];
bool ifrt[N];
int lan[N], ran[N];
void get_lran(int x) {
if (!lson[x] && !rson[x])
return lan[x] = ran[x] = x, void();
get_lran(lson[x]);
get_lran(rson[x]);
lan[x] = lan[lson[x]];
ran[x] = ran[rson[x]];
}
struct XDS {
#define ls x << 1
#define rs x << 1 | 1
int ifv[N * 4], val[N * 4], tag[N * 4];
void pushup(int x) {
ifv[x] = ifv[ls] + ifv[rs];
val[x] = val[ls] + val[rs];
return;
}
void pushdown(int x) {
if (ifv[ls])
tag[ls] += tag[x];
if (ifv[rs])
tag[rs] += tag[x];
val[ls] += ifv[ls] * tag[x];
val[rs] += ifv[rs] * tag[x];
tag[x] = 0;
return;
}
void ins_ifv(int x, int l, int r, int pos, int v) {
if (l == r)
return ifv[x] = v, void();
if (tag[x])
pushdown(x);
int mid = l + r >> 1;
if (pos <= mid)
ins_ifv(ls, l, mid, pos, v);
else
ins_ifv(rs, mid + 1, r, pos, v);
pushup(x);
return;
}
void ins_val(int x, int l, int r, int ql, int qr, int v) {
if (ql > qr)
return;
if (ql <= l && r <= qr) {
tag[x] += v;
val[x] += ifv[x] * v;
return;
}
// cout<<x<<" "<<l<<" "<<r<<" "<<ql<<" "<<qr<<" "<<v<<endl;
if (tag[x])
pushdown(x);
int mid = l + r >> 1;
if (ql <= mid)
ins_val(ls, l, mid, ql, qr, v);
if (qr > mid)
ins_val(rs, mid + 1, r, ql, qr, v);
pushup(x);
return;
}
int query(int x, int l, int r, int ql, int qr) {
if (ql > qr)
return 0;
if (ql <= l && r <= qr)
return val[x];
if (tag[x])
pushdown(x);
int mid = l + r >> 1, ret = 0;
if (ql <= mid)
ret += query(ls, l, mid, ql, qr);
if (qr > mid)
ret += query(rs, mid + 1, r, ql, qr);
pushup(x);
return ret;
}
#undef ls
#undef rs
} lxds, rxds;
int litval[N], ritval[N], all;
int son[N], siz[N], dep[N], top[N];
int dfn[N], cnt;
int ljmp[N], rjmp[N];
void dfs_fi(int x) {
siz[x] = 1;
if (x == rt)
ljmp[x] = rjmp[x] = x;
else if (lson[fa[x]] == x)
ljmp[x] = ljmp[fa[x]], rjmp[x] = x;
else
ljmp[x] = x, rjmp[x] = rjmp[fa[x]];
if (!lson[x] && !rson[x])
return;
dep[lson[x]] = dep[x] + 1;
dfs_fi(lson[x]);
dep[rson[x]] = dep[x] + 1;
dfs_fi(rson[x]);
siz[x] += siz[lson[x]] + siz[rson[x]];
if (siz[lson[x]] > siz[rson[x]])
son[x] = lson[x];
else
son[x] = rson[x];
}
void dfs_se(int x, int f) {
dfn[x] = ++cnt;
top[x] = f;
// cout<<x<<" "<<cnt<<"ZZZ"<<" ";
if (!lson[x] && !rson[x])
return;
// cout<<lson[x]<<endl;
if (son[x] == lson[x]) {
dfs_se(lson[x], f);
dfs_se(rson[x], rson[x]);
rxds.ins_ifv(1, 1, n, dfn[x], ran[rson[x]] - lan[rson[x]] + 1);
// cout<<x<<" "<<ran[rson[x]]-lan[rson[x]]+1<<endl;
} else {
dfs_se(rson[x], f);
dfs_se(lson[x], lson[x]);
lxds.ins_ifv(1, 1, n, dfn[x], ran[lson[x]] - lan[lson[x]] + 1);
}
}
int LCA(int x, int y) {
while (top[x] != top[y]) {
if (dep[top[x]] < dep[top[y]])
swap(x, y);
x = fa[top[x]];
}
return dep[x] < dep[y] ? x : y;
}
void change_l(int x, int lca, int v, int lc) {
if (son[x] == rson[x])
ritval[x] += v * (ran[rson[x]] - lan[rson[x]] + 1);
// cout<<x<<" "<<lca<<" "<<top[x]<<endl;
if (top[x] == x) {
rxds.ins_val(1, 1, n, dfn[top[x]], dfn[x], v);
if (top[x] == lson[fa[top[x]]] && fa[top[x]] != lca)
ritval[fa[top[x]]] += v * (ran[rson[fa[top[x]]]] - lan[rson[fa[top[x]]]] + 1);
if (top[x] == rson[fa[top[x]]])
x = fa[fa[top[x]]];
else
x = fa[top[x]];
}
while (top[x] != top[lca] && dep[x] > dep[lca]) {
// cout<<dfn[top[x]]<<endl;
// cout<<x<<" "<<top[x]<<endl;
rxds.ins_val(1, 1, n, dfn[top[x]], dfn[x], v);
if (top[x] == lson[fa[top[x]]] && fa[top[x]] != lca)
ritval[fa[top[x]]] += v * (ran[rson[fa[top[x]]]] - lan[rson[fa[top[x]]]] + 1);
if (top[x] == rson[fa[top[x]]])
x = fa[fa[top[x]]];
else
x = fa[top[x]];
}
if (son[lca] == lc || lca == lc)
rxds.ins_val(1, 1, n, dfn[lca] + 1, dfn[x], v);
else
rxds.ins_val(1, 1, n, dfn[lc], dfn[x], v);
}
void change_r(int x, int lca, int v, int lc) {
if (son[x] == lson[x])
litval[x] += v * (ran[lson[x]] - lan[lson[x]] + 1);
if (top[x] == x) {
lxds.ins_val(1, 1, n, dfn[top[x]], dfn[x], v);
if (top[x] == rson[fa[top[x]]] && fa[top[x]] != lca)
litval[fa[top[x]]] += v * (ran[lson[fa[top[x]]]] - lan[lson[fa[top[x]]]] + 1);
if (top[x] == lson[fa[top[x]]])
x = fa[fa[top[x]]];
else
x = fa[top[x]];
}
while (top[x] != top[lca] && dep[x] > dep[lca]) {
lxds.ins_val(1, 1, n, dfn[top[x]], dfn[x], v);
if (top[x] == rson[fa[top[x]]] && fa[top[x]] != lca)
litval[fa[top[x]]] += v * (ran[lson[fa[top[x]]]] - lan[lson[fa[top[x]]]] + 1);
if (top[x] == lson[fa[top[x]]])
x = fa[fa[top[x]]];
else
x = fa[top[x]];
}
if (son[lca] == lc || lca == lc)
lxds.ins_val(1, 1, n, dfn[lca] + 1, dfn[x], v);
else
lxds.ins_val(1, 1, n, dfn[lc], dfn[x], v);
}
void change(int l, int r, int v) {
int lca = LCA(l, r);
// cout<<l<<" "<<r<<" "<<lca<<" "<<fa[lca]<<endl;
// if(lan[lca]==lan[l]&&ran[lca]==ran[r])lca=fa[lca];
if (l == 1 && r == (n + 1 >> 1))
return all += v * (r - l + 1), void();
int lx = l, rx = r;
if (ljmp[lx] == ljmp[lca] && rjmp[rx] == rjmp[lca]) {
if (ljmp[lx] != lca) {
// cout<<"fuck"<<" "<<dfn[fa[lca]]<<endl;
if (lca == son[fa[lca]])
litval[fa[lca]] += v * (r - l + 1);
else
lxds.ins_val(1, 1, n, dfn[fa[lca]], dfn[fa[lca]], v);
} else {
if (lca == son[fa[lca]])
ritval[fa[lca]] += v * (r - l + 1);
else
rxds.ins_val(1, 1, n, dfn[fa[lca]], dfn[fa[lca]], v);
}
} else if (ljmp[lx] == ljmp[lca]) {
// cout<<"SB"<<" "<<rx<<" "<<rjmp[rx]<<" "<<fa[rjmp[rx]]<<endl;
int sb = lca;
lca = fa[lca];
change_r(fa[rjmp[rx]], lca, v, sb);
} else if (rjmp[rx] == rjmp[lca]) {
// cout<<"SB"<<endl;
int sb = lca;
lca = fa[lca];
// cout<<lx<<" "<<ljmp[lx]<<endl;
change_l(fa[ljmp[lx]], lca, v, sb);
// cout<<ritval[9]<<endl;
} else {
// cout<<"FXT"<<endl;
change_l(fa[ljmp[lx]], lca, v, lca);
change_r(fa[rjmp[rx]], lca, v, lca);
}
}
int query_l(int x, int lca, int lc) {
int ret = 0; // cout<<x<<" "<<lca<<endl;
if (son[x] == rson[x])
ret += ritval[x];
// cout<<ret<<" "<<x<<" "<<top[x]<<endl;
if (top[x] == x) {
// cout<<top[x]<<" "<<x<<endl;
ret += rxds.query(1, 1, n, dfn[top[x]], dfn[x]);
// cout<<ret<<endl;
// cout<<fa[top[x]]<<" "<<lca<<endl;
if (top[x] == lson[fa[top[x]]] && fa[top[x]] != lca)
ret += ritval[fa[top[x]]];
if (top[x] == rson[fa[top[x]]])
x = fa[fa[top[x]]];
else
x = fa[top[x]];
}
// cout<<ret<<endl;
while (top[x] != top[lca] && dep[x] > dep[lca]) {
ret += rxds.query(1, 1, n, dfn[top[x]], dfn[x]);
// cout<<x<<" "<<top[x]<<" "<<ret<<endl;
if (top[x] == lson[fa[top[x]]] && fa[top[x]] != lca)
ret += ritval[fa[top[x]]];
if (top[x] == rson[fa[top[x]]])
x = fa[fa[top[x]]];
else
x = fa[top[x]];
}
if (son[lca] == lca || lca == lc)
ret += rxds.query(1, 1, n, dfn[lca] + 1, dfn[x]);
else
ret += rxds.query(1, 1, n, dfn[lc], dfn[x]);
return ret;
}
int query_r(int x, int lca, int lc) {
int ret = 0;
if (son[x] == lson[x])
ret += litval[x];
// cout<<x<<" "<<(x==son[fa[x]])<<" "<<lxds.query(1,1,n,dfn[fa[x]],dfn[fa[x]])<<endl;
if (top[x] == x) {
ret += lxds.query(1, 1, n, dfn[top[x]], dfn[x]);
if (top[x] == rson[fa[top[x]]] && fa[top[x]] != lca)
ret += litval[fa[top[x]]];
if (top[x] == lson[fa[top[x]]])
x = fa[fa[top[x]]];
else
x = fa[top[x]];
}
while (top[x] != top[lca] && dep[x] > dep[lca]) {
// cout<<x<<" "<<top[x]<<endl;
ret += lxds.query(1, 1, n, dfn[top[x]], dfn[x]);
if (top[x] == rson[fa[top[x]]] && fa[top[x]] != lca)
ret += litval[fa[top[x]]];
if (top[x] == lson[fa[top[x]]])
x = fa[fa[top[x]]];
else
x = fa[top[x]];
}
if (son[lca] == lc || lca == lc)
ret += lxds.query(1, 1, n, dfn[lca] + 1, dfn[x]);
else
ret += lxds.query(1, 1, n, dfn[lc], dfn[x]);
// int sum=0,now=x;
// while(x!=lca)cout<<dfn[x]<<" "<<x<<" "<<(x==rson[fa[x]])<<"
// "<<lxds.query(1,1,n,dfn[x],dfn[x])<<endl,x=fa[x],sum+=lxds.query(1,1,n,dfn[x],dfn[x]); cout<<sum<<"
// "<<lxds.query(1,1,n,dfn[lca]+1,dfn[now])<<" "<<dfn[lca]+1<<" "<<dfn[now]<<endl; sum=0;x=now;
// while(x!=lca)cout<<dfn[x]<<" "<<x<<" "<<(x==rson[fa[x]])<<"
// "<<lxds.query(1,1,n,dfn[x],dfn[x])<<endl,sum+=lxds.query(1,1,n,dfn[x],dfn[x]),x=fa[x];
return ret;
}
int query(int l, int r) {
int lca = LCA(l, r), ret = 0;
if (l == 1 && r == (n + 1 >> 1))
return all;
int lx = l, rx = r;
// cout<<l<<" "<<r<<" "<<lca<<" "<<"SB"<<endl;
if (ljmp[lx] == ljmp[lca] && rjmp[rx] == rjmp[lca]) {
if (ljmp[lx] != lca) {
if (lca == son[fa[lca]])
ret += litval[fa[lca]];
else
ret += lxds.query(1, 1, n, dfn[fa[lca]], dfn[fa[lca]]);
} else {
// cout<<"sb"<<" "<<lca<<" "<<fa[lca]<<endl;
if (lca == son[fa[lca]])
ret += ritval[fa[lca]];
else
ret += rxds.query(1, 1, n, dfn[fa[lca]], dfn[fa[lca]]);
}
} else if (ljmp[lx] == ljmp[lca]) {
// cout<<"zzz"<<endl;
int sb = lca;
lca = fa[lca];
ret = query_r(fa[rjmp[rx]], lca, sb);
} else if (rjmp[rx] == rjmp[lca]) {
int sb = lca;
lca = fa[lca];
ret = query_l(fa[ljmp[lx]], lca, sb);
} else {
// cout<<"zzz"<<endl;
// cout<<fa[ljmp[lx]]<<" ";
ret += query_l(fa[ljmp[lx]], lca, lca);
// cout<<ret<<" ";
ret += query_r(fa[rjmp[rx]], lca, lca);
// cout<<ret<<endl;
}
return ret;
}
signed main() {
freopen("pigeons.in", "r", stdin);
freopen("pigeons.out", "w", stdout);
scanf("%lld%lld", &n, &q);
fo(i, n + 1, 2 * n - 1) {
scanf("%lld%lld", &lson[i], &rson[i]);
fa[lson[i]] = i;
fa[rson[i]] = i;
ifrt[lson[i]] = true;
ifrt[rson[i]] = true;
}
fo(i, 1, 2 * n - 1) if (!ifrt[i]) rt = i;
n = 2 * n - 1;
get_lran(rt);
// cout<<rt<<endl;
dfs_fi(rt);
dfs_se(rt, rt);
// fo(i,1,n)cout<<i<<" "<<ljmp[i]<<" "<<rjmp[i]<<endl;
while (q--) {
int tp, l, r, d;
scanf("%lld", &tp);
if (tp == 1) {
scanf("%lld%lld%lld", &l, &r, &d);
change(l, r, d);
} else {
scanf("%lld%lld", &l, &r);
// cout<<rxds.query(1,1,n,dfn[34],dfn[34])<<" "<<"now"<<endl;
printf("%lld\n", query(l, r));
}
}
}
QQ:2953174821

浙公网安备 33010602011771号