題目:鏈結
a. an olympian math problem
輸出n-1即可(女朋友猜的)。
#includeusing namespace std;
#define ll long long
ll fac[103];
int main()
for(int i=1;i<=m;i++)
ll ans=0;
for(int i=1;i<=n;i++)}}
printf("case #%d: %lld\n",++cas,ans);
}return 0;
}
e. ac challenge
狀壓dp,對於每個狀態判斷是否合法(即若i在集合中,則i所依賴的題目也要在集合中),
若此狀態合法,則用它的上一步狀態來更新此狀態。
**:
#includeusing namespace std;
#define ll long long
const int maxn=22;
ll a[maxn],b[maxn];
ll dp[1<<21];
vectorg[maxn];
int main()
if(bb) continue;
for(int i=0;i>i&1)) continue;
int t=0,s=s;
while(s)
dp[s]=max(dp[s],dp[s^(1對於當前的s從左到右找到第乙個小於等於s的a[i],讓後將a[i]個燈泡換成新的,a[i]改為inf。
然後燈泡數量s=s-a[i]。線段樹維護即可。
#includeusing namespace std;
const int maxn=1e5+10;
int n,k,q,s;
int a[maxn],tree[maxn<<2],ans1[maxn],ans2[maxn];
void build(int l,int r,int rt)
int mid=(l+r)/2;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
tree[rt]=min(tree[rt<<1],tree[rt<<1|1]);
}int query(int c,int l,int r,int rt)
int mid=(l+r)/2;
if(tree[rt<<1]<=c) return query(c,l,mid,rt<<1);
else return query(c,mid+1,r,rt<<1|1);
}void update(int l,int l,int r,int rt)
int mid=(l+r)/2;
if(l<=mid) update(l,l,mid,rt<<1);
else update(l,mid+1,r,rt<<1|1);
tree[rt]=min(tree[rt<<1],tree[rt<<1|1]);
}int main()
ans2[i]=s;
if(tree[1]==2e9)
break;}}
scanf("%d",&q);
while(q--)
return 0;
}
j. sum
把每個數拆成素數相乘。
設x=(a[1]^b[1])*(a[2]^b[2])*(a[3]^b[3])....
其中a[i]為質數,b[i]為指數,
然後令x=n*m,
n=(a[1]^b1[1])*(a[2]^b1[2])*(a[3]^b1[3])...
m=(a[1]^b2[1])*(a[2]^b2[2])*(a[3]^b2[3])...
則有b[1]=b1[1]+b2[1],b[2]=b1[2]+b2[2],b[3]=b1[3]+b2[3]...
問題轉化成有幾種合法方法分配b1,b2兩個陣列。
對於x的所有b[i],若存在b[i]>2,則一定無法合理安排。
因為b1[i]和b2[i]中一定有乙個大於2,這樣n和m至少有
乙個數字含有乙個完全平方數的約數。
假設b1[i]>2,則一定有n=t*a[i]^2,因此n不合法。
若b[i]=2,則只有b1[i]=1,b2[i]=1,一種選擇。
若b[i]==1,則可以b1[i]=0,b2[i]=1或b1[i]=1,b2[i]=0。
**:
#include#includeusing namespace std;
#define ll long long
const int maxn=20000005;
int a[maxn],b[maxn];
bool vis[maxn];
int p[maxn],q[maxn],pp[maxn];
int sum[maxn];
void init()
if(k>2) a[i]=0;
else if(k==2) a[i]=a[x];
else a[i]=2*a[x];
}sum[i]=sum[i-1]+a[i];
}}int main()
return 0;
}
l. magical girl haze
把每個點拆成k+1個點建立分層圖,對於第i個點,拆成i,i+n,i+2*n...i+k*n
若原圖中i~j有一條權值為x的邊,則
add_edge(i,j,x),add_edge(i+n,j+n,x).....add_edge(i+k*n,j+k*n,x)
add_edge(i,j+n,0),add_edge(i+n,j+2*n,0)....add_edge(i+(k-1)*n,j+k*n,0)
每向上走一層相當於走了一條權值為0的邊,
假設走了(i,j+n,0)相當於從第0層走到了第一層,而把i~j這條邊的權值改為0。
最後輸出1~(k+1)*n的最短路即可。
**:
#include using namespace std;
const int mn = 1400010, mm = 5000010;
const long long inf = 1e18;
int n, m, k;
int num;
int from[mm], to[mm], nx[mm], fr[mm];
long long cost[mm];
void addedge(int a, int b, long long c)
for (int i = 0; i < k ; i++) }
struct node
} dis[mn];
priority_queueq;
void dijkstra(int a)
dis[a].w = 0;
q.push(dis[a]);
while (!q.empty())
} }}
int main()
dijkstra(1);
printf("%lld\n", dis[k * n + n].w);
} return 0;
}
2018 ICPC 南京網路賽 skr
題意 給出乙個字串,求它的所有回文子串轉化成數字的和,對1e9 7取模。題解 先上manacher,然後列舉每個點,按照半徑從大到小的順序列舉回文串,遇到出現過的就break,統計答案即可。注意的是,判重時只能用pb ds中的gp hash table,unordered map會t,同時需要兩個字...
2018 icpc南京網路賽G 線段樹
思路 因為只有1e5的資料。我們可以模擬一下所有情況全算出來,把答案存下來即可。但會一遍一遍的遍歷超時,我們可以優化遍歷的方式,因為只有1e5的房間,我們每次找的房間都是小於當前新燈泡數且最前面的房間。這個查詢用一顆線段樹既可以解決。我們每次找到乙個滿足的房間就讓當前燈泡是減去這個房間的燈泡數,然後...
2018 icpc南京賽區網路賽 J題 附模板
求前1 n每個數的分解的非平方因子數乘積方式的和 用修改的線性篩做 a i 表示數i的分解方法數,對每個數多試幾組資料可以發現 1.質數的分解方法數始終為2 2.合數的分解方法數為其兩因子數的分解方法數的乘積 若該合數為平方數,則分解方法數要除4 若該合數的其中乙個因子是n次方數 n 3 則分解方法...