160104 HAOI 2013 요약
한쪽은 무게가 많이 나가고, 반대로 여러 배낭을 한 번 뛰고, 그 인형은 왼쪽과 오른쪽의 돈을 일일이 세어 보았다.
시험장상수를 오래 끊었는데 데이터가 100이 터진 거예요.
T2
dp[I]를 설정하면 현재 점 검은색이 이기려면 반드시 몇 개의 잎사귀 노드를 획득해야 합니다
만약 현재 흰색 노드의 결정점이라면 dp[I]=sigmadp[son[i]]
만약 현재 검은색 노드의 결정점이라면 dp[I]=min{dp[son[i]}
경계는 잎 노드 dp=1
시험장에서 부주의로 첫 번째 수와 두 번째 수를 반대로 출력했다...100->10
T3
폭력
//Copyright(c)2015 liuchenrui
#include<cstdio>
#include<ctime>
using namespace std;
inline void splay(int &v){
v=0;char c=0;int p=1;
while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();}
while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();}
v*=p;
}
int dp1[1005][1005];
int dp2[1005][1005];
int a[1005],b[1005],c[1005];
int main(){
freopen("bag.in","r",stdin);
freopen("bag.out","w",stdout);
int n;splay(n);
for(int i=1;i<=n;i++){
splay(a[i]),splay(b[i]),splay(c[i]);
}
for(int i=1;i<=n;i++){
for(int j=1000;j>=0;j--){
for(int k=0;k<=c[i];k++){
if(j-k*a[i]<0)break;
int l=dp1[i-1][j-k*a[i]]+k*b[i];
if(l>dp1[i][j])dp1[i][j]=l;
}
}
}
for(int i=n;i>=1;i--){
for(int j=1000;j>=0;j--){
for(int k=0;k<=c[i];k++){
if(j-k*a[i]<0)break;
int l=dp2[i+1][j-k*a[i]]+k*b[i];
if(l>dp2[i][j])dp2[i][j]=l;
}
}
}
int q,lim,money;splay(q);
for(int i=1;i<=q;i++){
splay(lim),splay(money);
int ans=0;lim++;
for(int i=0;i<=money;i++){
int p=dp1[lim-1][i]+dp2[lim+1][money-i];
if(p>ans)ans=p;
}
printf("%d
",ans);
}
}
//Copyright(c)2015 liuchenrui
#include<cstdio>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<cstring>
#define white 0
#define black 1
#define inf 1000000000
using namespace std;
inline void splay(int &v){
v=0;char c=0;int p=1;
while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();}
while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();}
v*=p;
}
struct Edge{
int to,next;
}edge[400010];
int first[200010],size,n;
void addedge(int x,int y){
size++;
edge[size].to=y;
edge[size].next=first[x];
first[x]=size;
}
int dp[200010];
bool isblack[200010],iswhite[200010];
bool is[200010];int col[200010];
void dfs(int now,int fa){
col[now]=(col[fa]^1);is[fa]=false;
for(int u=first[now];u;u=edge[u].next){
if(edge[u].to!=fa){
dfs(edge[u].to,now);
}
}
}
void treedp1(int now,int fa){
if(is[now]){dp[now]=1;return;}
dp[now]=((col[now]==black)?inf:0);
for(int u=first[now];u;u=edge[u].next){
if(edge[u].to==fa)continue;
treedp1(edge[u].to,now);
if(col[now]==black)dp[now]=min(dp[now],dp[edge[u].to]);
if(col[now]==white)dp[now]+=dp[edge[u].to];
}
}
void treedp2(int now,int fa){
if(is[now]){dp[now]=1;return;}
dp[now]=((col[now]==black)?0:inf);
for(int u=first[now];u;u=edge[u].next){
if(edge[u].to==fa)continue;
treedp2(edge[u].to,now);
if(col[now]==white)dp[now]=min(dp[now],dp[edge[u].to]);
if(col[now]==black)dp[now]+=dp[edge[u].to];
}
}
void dfs1(int now,int fa){
if(is[now]){isblack[now]=true;return;}
for(int u=first[now];u;u=edge[u].next){
if(edge[u].to==fa)continue;
if(col[now]==white)dfs1(edge[u].to,now);
else if(dp[edge[u].to]==dp[now])dfs1(edge[u].to,now);
}
}
void dfs2(int now,int fa){
if(is[now]){iswhite[now]=true;return;}
for(int u=first[now];u;u=edge[u].next){
if(edge[u].to==fa)continue;
if(col[now]==black)dfs2(edge[u].to,now);
else if(dp[edge[u].to]==dp[now])dfs2(edge[u].to,now);
}
}
void calc_black(){
treedp1(1,0);dfs1(1,0);
}
void calc_white(){
treedp2(1,0);dfs2(1,0);
}
int main(){
int _q=20<<20;
char *_p=(char*)malloc(_q)+_q;
__asm__("movl %0, %%esp
"::"r"(_p));
freopen("gametree.in","r",stdin);
freopen("gametree.out","w",stdout);
splay(n);memset(is,true,sizeof(is));
for(int i=2;i<=n;i++){
int x;splay(x);
addedge(i,x),addedge(x,i);
}
dfs(1,0);calc_black();calc_white();
int ans1=0,ans2=0,ans3=0;
for(int i=n;i>=1;i--){
if(isblack[i]&&iswhite[i]){
ans1++;ans2=i;ans3^=i;
}
}
printf("%d %d %d
",ans2,ans1,ans3);
}
//Copyright(c)2015 liuchenrui
#include<cstdio>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define eps 1e-7
#define E 1000000000
using namespace std;
inline void splay(int &v){
v=0;char c=0;int p=1;
while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();}
while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();}
v*=p;
}
int n,lastans,tot;
int num[100010],id[100010];double h[100010];
int main(){
freopen("segment.in","r",stdin);
freopen("segment.out","w",stdout);
splay(n);while(n--){
int opt;splay(opt);
if(!opt){
int x;splay(x);x=(x+lastans-1)%39989+1;
printf("%d
",lastans=num[x]);
}
else{
int x,y,xx,yy;splay(x),splay(y),splay(xx),splay(yy);
x=(x+lastans-1)%39989+1;y=(y+lastans-1)%1000000000+1;++tot;
xx=(xx+lastans-1)%39989+1;yy=(yy+lastans-1)%1000000000+1;
if(x>xx)swap(x,xx),swap(y,yy);
double k=double(yy-y)/double(xx-x),b=double(y)-k*double(x);
for(int j=x;j<=xx;j++){
if(k*j+b>h[j]){
h[j]=k*j+b,num[j]=tot;
}
}
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
160104 HAOI 2013 요약한쪽은 무게가 많이 나가고, 반대로 여러 배낭을 한 번 뛰고, 그 인형은 왼쪽과 오른쪽의 돈을 일일이 세어 보았다. 시험장상수를 오래 끊었는데 데이터가 100이 터진 거예요. dp[I]를 설정하면 현재 점 검은색이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.