선분 수 분할 치료
70959 단어 데이터 구조
내 가 모 르 는 알고리즘 이 많 더 라 고.아마도 일부 조건 을 주 었 을 것 이다. 이런 조건 들 은 효력 이 발생 하기 시작 하 는 시간 과 효력 을 잃 는 시간 이 있 고, 그 다음 에 특정한 시간 내 에 조건 제한 하에 서 의 답안 을 묻는다.방법 은 시간 대 에 선분 나 무 를 만 드 는 것 이다. 조건 을 시작 시간 과 끝 시간 구간 에 따라 조회 하 는 방식 으로 선분 나 무 를 삽입 한 다음 에 전체 선분 나 무 를 옮 겨 다 니 며 답 을 얻 는 것 이다. 나 는 나의 아버지 로부터 그것 을 물 려 받 은 다음 에 나의 조건 을 더 해서 거 슬러 올 라 갈 때 나의 조건 을 취소 하 는 것 이다.
이분 도
..............................................................................................각 점 에서 아버지의 변 권 은 1 / 0 으로 아버지 와 동 색 여 부 를 나타 낸다.그래서 선분 수 를 끼 워 서 나 누 면 돼 요.
//Achen
#include
#define For(i,a,b) for(register int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(register int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=200007;
typedef long long LL;
typedef double db;
using namespace std;
int n,m,T;
template<typename T> void read(T &x) {
char ch=getchar(); T f=1; x=0;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') f=-1,ch=getchar();
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}
#define pr pair
#define MP make_pair
#define se second
#define fi first
vector<pr>vc[N<<2];
vector<int>cx[N<<2];
#define lc (x<<1)
#define rc ((x<<1)|1)
#define mid ((l+r)>>1)
void add(int x,int l,int r,int ql,int qr,int u,int v) {
if(l>=ql&&r<=qr) {
vc[x].push_back(MP(u,v));
return ;
}
if(ql<=mid) add(lc,l,mid,ql,qr,u,v);
if(qr>mid) add(rc,mid+1,r,ql,qr,u,v);
}
int fa[N],fg[N];
pr find(int x) {
if(x==fa[x]) return MP(x,0);
pr t=find(fa[x]);
return MP(t.fi,t.se+fg[x]);
}
int no[N];
void qry(int x,int l,int r) {
int up=vc[x].size(),fl=1;
For(i,0,up-1) {
pr e=vc[x][i];
int u=e.fi,v=e.se;
pr t1=find(u),t2=find(v);
if(t1.fi==t2.fi) {
if(t1.se%2==t2.se%2) { fl=0; break; }
else continue;
}
else {
fa[t1.fi]=t2.fi;
fg[t1.fi]=(t1.se%2==t2.se%2);
cx[x].push_back(t1.fi);
}
}
if(!fl) For(i,l,r) no[i]=1;
if(l!=r&&fl) { qry(lc,l,mid); qry(rc,mid+1,r); }
up=cx[x].size();
Rep(i,up-1,0) fa[cx[x][i]]=cx[x][i];
}
int main() {
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
read(n); read(m); read(T);
For(i,1,n) fa[i]=i,fg[i]=0;
For(i,1,m) {
int u,v,s,t;
read(u); read(v);
read(s); read(t);
if(s+1<=t) add(1,1,T,s+1,t,u,v);
}
qry(1,1,T);
For(i,1,T) if(!no[i]) puts("Yes"); else puts("No");
Formylove;
}
LibreOJ Round \ # 6 꽃 뭉치
.....................................................................................새로 추 가 된 수정 사항 은 현재 문의 뒤에 있 습 니 다. 우 리 는 선분 트 리 에서 걸 어가 면서 읽 습 니 다.수정 을 읽 을 때 까지 질문 을 읽 을 때 까지 계속 고 쳐 라. 질문 을 읽 을 때 까지 라인 트 리 에서 걷 고, 질문 하 는 곳 으로 가서 대답 한 후에 계속 읽 어 라.더욱 오묘 한 것 은 이 문 제 를 선분 수 로 나 누 어 이렇게 하면 1500 2 l o g 15000 ^ 2log 150002 log 의 (불만) 인 데 거 위 는 지나 갈 수 있 습 니까?
//Achen
#include
#define For(i,a,b) for(register int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(register int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=15007;
typedef long long LL;
typedef double db;
using namespace std;
int T,V,oo,nowti,lastans;
template<typename T> void read(T &x) {
char ch=getchar(); T f=1; x=0;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') f=-1,ch=getchar();
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}
#define pr pair
#define MP make_pair
#define se second
#define fi first
vector<pr>vc[N<<2];
int f[20][N];
#define lc (x<<1)
#define rc ((x<<1)|1)
#define mid ((l+r)>>1)
void add(int x,int l,int r,int ql,int qr,int v,int w) {
if(l>=ql&&r<=qr) {
vc[x].push_back(MP(v,w));
return ;
}
if(ql<=mid) add(lc,l,mid,ql,qr,v,w);
if(qr>mid) add(rc,mid+1,r,ql,qr,v,w);
}
int op,vv,ww,tt;
void get_read() {
while(nowti<T) {
nowti++;
read(op); read(vv); vv-=oo*lastans;
if(op==1) {
read(ww); read(tt);
ww-=oo*lastans; tt-=oo*lastans;
if(tt>=nowti) add(1,1,T,nowti,tt,vv,ww);
}
else break;
}
}
void qry(int x,int l,int r,int dep) {
For(i,0,V) f[dep][i]=f[dep-1][i];
int up=vc[x].size();
For(i,0,up-1) {
pr t=vc[x][i];
int v=t.fi,w=t.se;
Rep(i,V,v) f[dep][i]=max(f[dep][i],f[dep][i-v]+w);
}
if(l!=r) {
if(nowti>=1&&nowti<=mid) qry(lc,l,mid,dep+1);
if(nowti>mid&&nowti<=r) qry(rc,mid+1,r,dep+1);
}
else if(op==2&&l==nowti) {
int t1,t2;
if(f[dep][vv]>=0) t1=1,t2=f[dep][vv];
else t1=t2=0;
printf("%d %d
",t1,t2);
lastans=(t1^t2); get_read();
}
}
int main() {
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
read(T); read(V); read(oo);
get_read();
memset(f,128,sizeof(f));
f[0][0]=0;
qry(1,1,T,1);
Formylove;
}
바보
...............................................................................멍청 하 다. 다시 한 번 자세히 보 니 숫자 L < 1000.점 권 을 수정 하려 면 한 수 를 삭제 하고 다른 수 를 넣 어야 하기 때문에 선형 기 는 자기 가 한 수 를 삭제 하지 않 고 선분 수 분 치 를 고려 해 야 한다.각 점 은 한 구간 에서 같은 값 을 유지 하고 선분 트 리 에 조건 을 추가 합 니 다. 이 구간 에 이 값 을 추가 합 니 다.그래서 현재 의 조건 은 모두 가입 이 고 선분 수 분 치 는 매번 아버지의 선형 기 를 계승 하면 된다.bitset 로 최적화 해 주세요.
//Achen
#include
#define For(i,a,b) for(register int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(register int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=1007;
typedef long long LL;
typedef double db;
using namespace std;
int ID,n,m,prt[N],UP;
template<typename T> void read(T &x) {
char ch=getchar(); T f=1; x=0;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') f=-1,ch=getchar();
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}
#define BT bitset
vector<BT>vc[N<<2];
BT prv[N],w,ans;
char s[N];
void getw() {
scanf("%s",s); w.reset();
int len=strlen(s);
UP=max(UP,len-1);
Rep(i,len-1,0)
if(s[i]=='1') w.set(len-i-1);
}
void print(BT A) {
int st=UP;
while(st&&!A.test(st)) st--;
while(st>=0) {
if(A.test(st)) putchar('1');
else putchar('0'); st--;
} puts("");
}
#define lc (x<<1)
#define rc ((x<<1)|1)
#define mid ((l+r)>>1)
void add(int x,int l,int r,int ql,int qr,int v) {
if(ql>qr) return ;
if(l>=ql&&r<=qr) {
vc[x].push_back(prv[v]);
return ;
}
if(ql<=mid) add(lc,l,mid,ql,qr,v);
if(qr>mid) add(rc,mid+1,r,ql,qr,v);
}
BT b[12][N];
void qry(int x,int l,int r,int dep) {
int up=vc[x].size();
For(i,0,UP) b[dep][i]=b[dep-1][i];
For(i,0,up-1) {
BT v=vc[x][i];
//printf("%d %d ",l,r); print(v);
Rep(j,UP,0) if(v.test(j)) {
if(b[dep][j].test(j)) v^=b[dep][j];
else { b[dep][j]=v; break; }
}
}
if(l==r) {
ans.reset();
Rep(i,UP,0) if(!ans.test(i)) ans^=b[dep][i];
print(ans);
return;
}
qry(lc,l,mid,dep+1); qry(rc,mid+1,r,dep+1);
}
int main() {
freopen("4644.in","r",stdin);
freopen("4644.out","w",stdout);
read(ID);
read(n); read(m);
For(i,1,n) prt[i]=1;
For(i,1,m) {
int u,v;
read(u); read(v); getw(); //print(w);
add(1,1,m,prt[u],i-1,u); prv[u]^=w; prt[u]=i;
add(1,1,m,prt[v],i-1,v); prv[v]^=w; prt[v]=i;
}
For(i,1,n) add(1,1,m,prt[i],m,i);
qry(1,1,m,1);
Formylove;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.