这里是liuzhangfeiabc的NOI2022代码。
包含两天t1、t2的非官方std代码(已在洛谷上提交通过)。
本来想在上一篇题解里放代码,但是这样文章就太长了,所以新开一篇文章放代码。
d1t1:
#include<bits/stdc++.h>
#define gc getchar()
#define pc putchar
#define li long long
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define pii pair<int,li>
#define md int mid = l + r >> 1
#define ln ls[q],l,mid
#define rn rs[q],mid + 1,r
using namespace std;
inline li read(){
li x = 0;
int y = 0,c = gc;
while(c < '0' || c > '9') y = c,c = gc;
while(c >= '0' && c <= '9') x = x * 10 + c - '0',c = gc;
return y == '-' ? -x : x;
}
inline void prt(li x){
if(x >= 10) prt(x / 10);
pc(x % 10 + '0');
}
inline void print(li x){
if(x < 0) pc('-'),x = -x;
prt(x);
}
int n,q;
vector<int> a[500010];
inline pii operator + (pii x,pii y){
if(x.fi == y.fi) return mp(x.fi,x.se + y.se);
if(x.se > y.se) return mp(x.fi,x.se - y.se);
return mp(y.fi,y.se - x.se);
}
int l[1000010],sl[1000010],fir[1000010],nw[1000010];
struct tree{
int rt[1000010],ls[20000010],rs[20000010],cnt;
pii mx[20000010];
inline void ins(int &q,int l,int r,int x,int y){
if(!q) q = ++cnt;
if(l == r){
mx[q] = mp(mx[q].fi + y,x);
return;
}
md;
if(mid >= x) ins(ln,x,y);
else ins(rn,x,y);
mx[q] = max(mx[ls[q]],mx[rs[q]]);
}
inline int mg(int p,int q,int l,int r){
if(!p || !q) return p + q;
if(l == r){
mx[q].fi += mx[p].fi;
return q;
}
md;
ls[q] = mg(ls[p],ln);
rs[q] = mg(rs[p],rn);
mx[q] = max(mx[ls[q]],mx[rs[q]]);
return q;
}
inline int cx(int q,int l,int r,int x){
if(!q) return 0;
if(l == r) return mx[q].fi;
md;
if(mid >= x) return cx(ln,x);
return cx(rn,x);
}
}t;
inline void ins(int x,int y){
a[nw[x]].pb(y);
t.ins(t.rt[x],1,n + q,y,1);
++sl[x];
}
inline void del(int x){
int &o = nw[x];
while(!a[o].size() && o) o = l[o];
if(!o){
o = fir[x] = x;
l[x] = 0;
return;
}
int y = a[o][a[o].size() - 1];
a[o].pop_back();
t.ins(t.rt[x],1,n + q,y,-1);
--sl[x];
}
inline void mg(int x,int y,int w){
nw[w] = nw[y];
fir[w] = fir[x];
l[fir[y]] = nw[x];
t.rt[w] = t.mg(t.rt[x],t.rt[y],1,n + q);
sl[w] = sl[x] + sl[y];
}
int qy[1000010],m;
inline pii fd(int x){
pii nw = t.mx[t.rt[x]];
if(!nw.fi || !nw.se) return mp(0,0);
return mp(nw.se,max(sl[x] & 1,nw.fi * 2 - sl[x]));
}
inline int chk(){
li a1 = 0,a2 = 0;
int i;
pii ans = mp(0,0);
for(i = 1;i <= m;++i){
a1 += sl[qy[i]];
ans = ans + fd(qy[i]);
}
if(!ans.fi) return -1;
for(i = 1;i <= m;++i) a2 += t.cx(t.rt[qy[i]],1,n + q,ans.fi);
return a2 * 2 > a1 ? ans.fi : -1;
}
int main(){
int i,j,l,op,x,y,w;
n = read();q = read();
for(i = 1;i <= n + q;++i) nw[i] = fir[i] = i;
for(i = 1;i <= n;++i){
l = read();
for(j = 1;j <= l;++j) ins(i,read());
}
for(i = 1;i <= q;++i){
op = read();
if(op == 1){
x = read();y = read();
ins(x,y);
}
else if(op == 2){
x = read();
del(x);
}
else if(op == 4){
x = read();y = read();w = read();
mg(x,y,w);
}
else{
m = read();for(j = 1;j <= m;++j) qy[j] = read();
print(chk());pc('\n');
}
}
return 0;
}
d1t2:
#include<bits/stdc++.h>
#define gc getchar()
#define pc putchar
#define li long long
using namespace std;
const int mo = 1000000007;
inline li read(){
li x = 0;
int y = 0,c = gc;
while(c < '0' || c > '9') y = c,c = gc;
while(c >= '0' && c <= '9') x = x * 10 + c - '0',c = gc;
return y == '-' ? -x : x;
}
inline void prt(li x){
if(x >= 10) prt(x / 10);
pc(x % 10 + '0');
}
inline void print(li x){
if(x < 0) pc('-'),x = -x;
prt(x);
}
int t,n,k,l[1010],r[1010];
li dy[1000010];
int to[1000010][10],tot;
unordered_map<li,int> ff;
li f[2][1000010];
inline int getzy(li i){
if(ff.find(i) != ff.end()) return ff[i];
int x = ++tot;ff[i] = x;dy[x] = i;
int j,g,h,p,q;
for(j = 0;j <= 7;++j){
li zy = 0;
for(g = 0;g <= 2;++g) for(h = 0;h <= 2;++h){
if(g == 2 && h == 2) continue;
int nw = (i >> (g * 3 + h) * 7) & 127;
if(!nw) continue;
--nw;
for(p = 0;p <= 2;++p){
for(q = g;q <= 2 && q <= g + h;++q){
if(p == 2 && q == 2) continue;
int o = (p * 3 + q) * 7;
li pre = (zy >> o) & 127;
int pr = (pre + 127) % 128;
pr = min(pr,101);
int sl = g + h + p;
int nxt = nw + max(0,sl - j) + (sl == j - 1);
if(nxt < pr) (zy ^= pre << o) ^= (nxt + 1ll) << o;
}
}
}
to[x][j] = getzy(zy);
}
return x;
}
int main(){
int i,j,g,h;
getzy(1);
t = read();
while(t--){
memset(f,0,sizeof(f));
n = read();k = read();
for(i = 1;i <= n;++i) l[i] = read(),r[i] = read();
f[0][1] = 1;
for(i = 1;i <= n;++i){
int ql = l[i],qr = r[i];
bool o = i & 1;
memset(f[o],0,tot * 8 + 8);
for(j = 1;j <= tot;++j) if(f[o ^ 1][j]){
li val = f[o ^ 1][j] % mo;
for(g = min(ql,7);g <= 7 && g <= qr;++g){
h = to[j][g];
if(g == 7) f[o][h] += val * (qr - max(ql,7) + 1) % mo;
else f[o][h] += val;
}
}
}
li as = 0;
for(i = 1;i <= tot;++i) if((dy[i] & 127) && (dy[i] & 127) - 1 <= k) as += f[n & 1][i] % mo;
if(k == 1){
int fg1 = 1,fg2 = (n == 3);
for(i = 1;i <= n;++i){
if(l[i]) fg1 = 0;
if(l[i] > 1 || r[i] < 1) fg2 = 0;
}
as -= fg1 + fg2;
}
print((as + mo) % mo);pc('\n');
}
return 0;
}
d2t1:
#include<bits/stdc++.h>
#define gc getchar()
#define pc putchar
#define li long long
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define pii pair<li,li>
using namespace std;
inline li read(){
li x = 0;
int y = 0,c = gc;
while(c < '0' || c > '9') y = c,c = gc;
while(c >= '0' && c <= '9') x = x * 10 + c - '0',c = gc;
return y == '-' ? -x : x;
}
inline void prt(li x){
if(x >= 10) prt(x / 10);
pc(x % 10 + '0');
}
inline void print(li x){
if(x < 0) pc('-'),x = -x;
prt(x);
}
int t,k,cnt;
const int mo1 = 998244853,mo2 = 1004353809,ds = 19491001;
unordered_map<li,int> hsb;
int ft1,ft2,ft3;
pii st1[100010],st2[100010],st3[100010];
struct tree{
int n,rt,fa[100010],fsts[100010],nxt[100010],sz[100010],ez[100010];
int zl[100010];
inline void dfs(int q){
sz[q] = 1;
for(int i = fsts[q];i;i = nxt[i]){
dfs(i);
sz[q] += sz[i];++ez[q];
}
ft3 = 0;for(int i = fsts[q];i;i = nxt[i]) st3[++ft3] = mp(zl[i],i);
sort(st3 + 1,st3 + ft3 + 1);
fsts[q] = 0;
for(int i = ft3;i;--i) nxt[st3[i].se] = fsts[q],fsts[q] = st3[i].se;
li hs1 = 0,hs2 = 0;
for(int i = 1;i <= ft3;++i){
hs1 = (hs1 * ds + st3[i].fi) % mo1;
hs2 = (hs2 * ds + st3[i].fi) % mo2;
}
li hs = hs1 * mo2 + hs2;
if(hsb.find(hs) == hsb.end()) hsb[hs] = ++cnt;
zl[q] = hsb[hs];
}
inline void init(){
memset(fa,0,n * 4 + 16);memset(fsts,0,n * 4 + 16);
memset(nxt,0,n * 4 + 16);memset(sz,0,n * 4 + 16);
memset(ez,0,n * 4 + 16);memset(zl,0,n * 4 + 16);
n = read();
rt = 0;
for(int i = 1;i <= n;++i){
if(i == 1) fa[i] = -1;
else fa[i] = i >> 1;
fa[i] = read();
if(fa[i] == -1) rt = i;
else nxt[i] = fsts[fa[i]],fsts[fa[i]] = i;
}
dfs(rt);
}
}t1,t2;
bool vis1[100010],vis2[100010];
int wei[50];
inline bool ck(vector<int> biao){
int m = biao.size();
for(int i = 0;i < (1 << m);++i){
int o = 0;
for(int j = 0;j < m;++j) if(i & (1 << j)) o |= biao[j];
if(wei[i] > wei[o]) return 0;
}
return 1;
}
inline bool chk(int p1,int p2,int k){
if(!p1) return !p2;
if(!p2) return t1.sz[p1] <= k;
if(t1.sz[p1] < t2.sz[p2] || t1.sz[p1] > t2.sz[p2] + k || t1.ez[p1] < t2.ez[p2]) return 0;
if(t1.zl[p1] == t2.zl[p2]) return 1;
if(!k) return 0;
ft1 = ft2 = 0;
for(int i = t1.fsts[p1];i;i = t1.nxt[i]) st1[++ft1] = mp(t1.zl[i],i),vis1[ft1] = 0;
for(int i = t2.fsts[p2];i;i = t2.nxt[i]) st2[++ft2] = mp(t2.zl[i],i),vis2[ft2] = 0;
int i = 1,j = 1,tot = 0;
while(i <= ft1){
while(j <= ft2 && st1[i].fi > st2[j].fi) ++j;
if(j <= ft2 && st1[i].fi == st2[j].fi) ++tot,vis1[i++] = 1,vis2[j++] = 1;
else ++i;
}
if(tot == ft1) return 1;
int mm = ft1 - tot;
if(mm > k) return 0;
vector<int> q1,q2,q3;q1.clear();q2.clear();q3.clear();
for(i = 1;i <= ft1;++i) if(!vis1[i]) q1.pb(st1[i].se);
for(i = 1;i <= ft2;++i) if(!vis2[i]) q2.pb(st2[i].se);
while(q2.size() < mm) q2.pb(0);
q3.resize(mm);
for(i = 0;i < mm;++i)
for(j = 0;j < mm;++j)
if(chk(q1[i],q2[j],k - mm + 1)) q3[i] |= 1 << j;
return ck(q3);
}
int main(){
int i,j;
for(i = 1;i < 32;++i) wei[i] = wei[i >> 1] + (i & 1);
read();t = read();k = read();
while(t--){
hsb.clear();cnt = 0;
t1.init();t2.init();
puts(chk(t1.rt,t2.rt,k) ? "Yes" : "No");
}
return 0;
}
d2d2:
#include<bits/stdc++.h>
#define gc getchar()
#define pc putchar
#define li long long
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define md int mid = l + r >> 1
#define ls q << 1
#define rs q << 1 | 1
#define ln ls,l,mid
#define rn rs,mid + 1,r
using namespace std;
inline li read(){
li x = 0;
int y = 0,c = gc;
while(c < '0' || c > '9') y = c,c = gc;
while(c >= '0' && c <= '9') x = x * 10 + c - '0',c = gc;
return y == '-' ? -x : x;
}
inline void prt(li x){
if(x >= 10) prt(x / 10);
pc(x % 10 + '0');
}
inline void print(li x){
if(x < 0) pc('-'),x = -x;
prt(x);
}
int T,n,m,cnt;
struct node{
int l,r,q,v;
}a[1000010];
inline bool operator < (node q,node w){
if(q.v != w.v) return q.v < w.v;
if(q.q != w.q) return q.q < w.q;
if(q.l != w.l) return q.l < w.l;
return q.r < w.r;
}
pii t[4000010];
int c[4000010];
inline void init(int q,int l,int r){
c[q] = 0;
if(l == r){
t[q] = mp(1,l);
return;
}
md;
init(ln);init(rn);
t[q] = min(t[ls],t[rs]);
}
inline void ud(int q,int l,int r,int x){
if(!x) return;
t[q].fi = x;t[q].se = l;
c[q] = x;
}
inline void ps(int q,int l,int r){
md;
ud(ln,c[q]);ud(rn,c[q]);
c[q] = 0;
}
inline void xg(int q,int l,int r,int al,int ar,int x){
if(al > ar) return;
if(l >= al && r <= ar){
ud(q,l,r,x);
return;
}
ps(q,l,r);md;
if(mid >= al) xg(ln,al,ar,x);
if(mid < ar) xg(rn,al,ar,x);
t[q] = min(t[ls],t[rs]);
}
inline pii cx(int q,int l,int r,int al,int ar){
if(al > ar) return mp(-1,-1);
if(l >= al && r <= ar) return t[q];
ps(q,l,r);md;
if(mid < al) return cx(rn,al,ar);
if(mid >= ar) return cx(ln,al,ar);
return min(cx(ln,al,ar),cx(rn,al,ar));
}
int as[1000010];
inline void dfs(int q,int l,int r){
if(l == r){
as[l] = t[q].fi;
t[q] = mp(0,l);c[q] = 0;
return;
}
ps(q,l,r);t[q] = mp(0,l);c[q] = 0;
md;dfs(ln);dfs(rn);
}
inline pii operator + (pii q,pii w){
return q.fi < w.fi ? q : w;
}
inline void ps2(int q){
t[ls].fi += c[q];c[ls] += c[q];
t[rs].fi += c[q];c[rs] += c[q];
c[q] = 0;
}
inline void xg2(int q,int l,int r,int al,int ar,int x){
if(al > ar) return;
if(l >= al && r <= ar){
t[q].fi += x;c[q] += x;
return;
}
ps2(q);md;
if(mid >= al) xg2(ln,al,ar,x);
if(mid < ar) xg2(rn,al,ar,x);
t[q] = t[ls] + t[rs];
}
inline pii cx2(int q,int l,int r,int al,int ar){
if(al > ar) return mp(-1,-1);
if(l >= al && r <= ar) return t[q];
ps2(q);md;
if(mid < al) return cx2(rn,al,ar);
if(mid >= ar) return cx2(ln,al,ar);
return cx2(ln,al,ar) + cx2(rn,al,ar);
}
int p[1000010];
inline void xg(int q){
for(int i = q;i <= n;i += i & -i) ++p[i];
}
inline int cx(int q){
int as = 0;
for(int i = q;i;i -= i & -i) as += p[i];
return as;
}
inline li chk(){
li ans = 0;
memset(p,0,n * 4 + 8);
for(int i = 1;i <= n;++i){
ans += i - 1 - cx(as[i]);
xg(as[i]);
}
return ans;
}
vector<node> b[1000010];
int mn[1000010];
int main(){
int i,j;
T = read();
while(T--){
n = read();m = read();
for(i = 1;i <= m;++i){
a[i].l = read();a[i].r = read();a[i].v = read();a[i].q = 0;
}
sort(a + 1,a + m + 1);
int lst = -1;cnt = 0;
for(i = 1;i <= m;++i){
if(a[i].v != lst) ++cnt;
lst = a[i].v;a[i].v = cnt;
}
init(1,1,n);
for(i = 1;i <= m;++i) xg(1,1,n,a[i].l,a[i].r,a[i].v);
bool fg = 0;
for(i = 1;i <= m;++i){
pii o = cx(1,1,n,a[i].l,a[i].r);
if(o.fi != a[i].v){
fg = 1;break;
}
a[i].q = o.se;
}
if(fg){
puts("-1");
continue;
}
dfs(1,1,n);
for(i = 1;i <= n;++i) b[i].clear();
for(i = 1;i <= m;++i) b[a[i].r].pb(a[i]);
for(i = 1;i <= cnt;++i) mn[i] = 0;
for(i = 1;i <= n;++i) xg2(1,1,n,1,as[i] - 1,1);
for(i = n;i;--i){
xg2(1,1,n,1,as[i] - 1,-1);
for(j = 0;j < b[i].size();++j) mn[b[i][j].v] = max(mn[b[i][j].v],b[i][j].q);
int o = as[i];
if(i != mn[as[i]]) as[i] = cx2(1,1,n,as[i],n).se;
if(as[i] == o) mn[as[i]] = 0;
xg2(1,1,n,as[i] + 1,n,1);
}
print(chk());pc('\n');
}
return 0;
}