A : A: A:
https://www.luogu.org/problem/P1053
#include<iostream>
#include<cstdio>
#include<ctype.h>
using namespace std;
inline int read(){
int x=0,f=0;char ch=getchar();
while(!isdigit(ch))f|=ch=='-',ch=getchar();
while(isdigit(ch))x=x*10+(ch^48),ch=getchar();
return f?-x:x;
}
bool vis[50007];
int c[50007],a[50007],aa[50007];
int d1[50007],d2[50007];
int n,ans=0;
inline void cir(){
c[1]=1,c[2]=a[1];
vis[c[1]]=vis[c[2]]=1;
for(int i=2;i<=n-1;++i){
if(c[i-1]==a[c[i]])c[i+1]=aa[c[i]],vis[c[i+1]]=1;
else if(c[i-1]==aa[c[i]])c[i+1]=a[c[i]],vis[c[i+1]]=1;
else puts("-1"),exit(0);
}
for(int i=1;i<=n;++i)if(!vis[i])puts("-1"),exit(0);
}
inline void work(){
for(int i=1;i<=n;++i){
d1[(c[i]-i+n)%n]++;
d2[(c[n-i+1]-i+n)%n]++;
}
for(int i=0;i<=n-1;++i)ans=max(ans,max(d1[i],d2[i]));
printf("%d\n",n-ans);
}
int main(){
n=read();
for(int i=1;i<=n;++i)a[i]=read(),aa[i]=read();
cir();
work();
return 0;
}
B : B: B:
https://www.luogu.org/problem/P1607
#include<iostream>
#include<cstdio>
#include<ctype.h>
#include<algorithm>
using namespace std;
inline int read(){
int x=0,f=0;char ch=getchar();
while(!isdigit(ch))f|=ch=='-',ch=getchar();
while(isdigit(ch))x=x*10+(ch^48),ch=getchar();
return f?-x:x;
}
int ans,w[50007];
struct OOO{
int u,v,c;
bool operator <(OOO b)const{
if(v!=b.v)return v<b.v;
return u<b.u;
}
}a[50007];
int main(){
int k=read(),n=read(),m=read();
for(int i=1;i<=k;++i)a[i].u=read(),a[i].v=read(),a[i].c=read();
sort(a+1,a+1+k);
for(int i=1;i<=k;++i){
if(w[a[i].u]>=m)continue;
int mi=1e9;
for(int j=a[i].u;j<=a[i].v && mi>0;++j)mi=min(m-w[j],mi);
if(mi>0) {
if(mi>=a[i].c){
ans+=a[i].c;
for(int j=a[i].u;j<a[i].v;++j)w[j]+=a[i].c;
}
else{
ans+=mi;
for(int j=a[i].u;j<a[i].v;++j)w[j]+=mi;
}
}
}
printf("%d\n",ans);
return 0;
}
C : C: C:
未找到原题
一句话题意:求高次函数零点
数据太大不得已写的 P y t h o n Python Python
# -*- coding: utf-8 -*-
eps = 1e-6
d = int(input())
a = [float(input()) for i in range(d + 1)][::-1]
l, r = -1e6, 1e6
def f(x) :
ans = 0.
for i in a : ans = ans * x + i
return ans
if f(l) < -eps :
for i in range(len(a)) : a[i] = -a[i]
while l + eps < r :
mid = (l + r) / 2.
if f(mid) > eps : l = mid
else : r = mid
print int(l * 1000)
D : D: D:
打不开给的字典链接
留坑
E : E: E:
https://www.luogu.org/problem/P2939
分层图最短路裸题(数组要开
k
+
1
k+1
k+1倍!)
#include<iostream>
#include<cstdio>
#include<ctype.h>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
typedef pair<int,int> pairs;
priority_queue<pairs,vector<pairs>,greater<pairs> > q;
inline int read(){
int x=0,f=0;char ch=getchar();
while(!isdigit(ch))f|=ch=='-',ch=getchar();
while(isdigit(ch))x=x*10+(ch^48),ch=getchar();
return f?-x:x;
}
int head[220007],cnt;
bool vis[220007];
int dis[220007];
int n,m,k,s=1,ans=99999999;
struct Edge{
int next,to,w;
}edge[40000007];
inline void add_edge(int from,int to,int w){
edge[++cnt].next=head[from];edge[cnt].w=w;
edge[cnt].to=to;head[from]=cnt;
}
inline void dijkstra(){
memset(dis,0x3f,sizeof dis);
dis[s]=0;q.push(make_pair(dis[s],s));
while(!q.empty()){
int x=q.top().second;q.pop();
if(vis[x])continue;vis[x]=1;
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(dis[to]>dis[x]+edge[i].w){
dis[to]=dis[x]+edge[i].w;
q.push(make_pair(dis[to],to));
}
}
}
}
int main(){
n=read(),m=read(),k=read();
for(int i=1;i<=m;++i){
int u=read(),v=read(),w=read();
add_edge(u,v+n,0),add_edge(v,u+n,0);
for(int j=0;j<k;++j)add_edge(u+j*n,v+j*n+n,0),add_edge(v+j*n,u+j*n+n,0);
for(int j=0;j<=k;++j){
add_edge(u+j*n,v+j*n,w);
add_edge(v+j*n,u+j*n,w);
}
}
dijkstra();
for(int i=1;i<=k+1;++i)ans=min(ans,dis[i*n]);
printf("%d",ans);
return 0;
}
F : F: F:
https://www.luogu.org/problem/P1051
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
char name[25],gb,xp;
int exam,bj,lw,ans,sum;
}a[110];
int n,tot=0;
bool cmp(node x,node y){
if(x.ans==y.ans)return x.sum<y.sum;
else return x.ans>y.ans;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].name>>a[i].exam>>a[i].bj>>a[i].gb>>a[i].xp>>a[i].lw;
if(a[i].exam>80&&a[i].lw>=1)a[i].ans+=8000;
if(a[i].exam>85&&a[i].bj>80)a[i].ans+=4000;
if(a[i].exam>90)a[i].ans+=2000;
if(a[i].xp=='Y'&&a[i].exam>85)a[i].ans+=1000;
if(a[i].bj>80&&a[i].gb=='Y')a[i].ans+=850;
a[i].sum=i;
tot+=a[i].ans;
}
sort(a+1,a+n+1,cmp);
cout<<a[1].name<<endl<<a[1].ans<<endl<<tot;
return 0;
}
G : G: G:
简单递推
但并未找到原题
#include<iostream>
#include<cstdio>
#include<ctype.h>
using namespace std;
const int mod=5000011;
inline int read(){
int x=0,f=0;char ch=getchar();
while(!isdigit(ch))f|=ch=='-',ch=getchar();
while(isdigit(ch))x=x*10+(ch^48),ch=getchar();
return f?-x:x;
}
int f[100007]={1};
int main(){
int n=read(),k=read();
f[1]=2;
for(int i=2;i<=n;++i)f[i]=(f[i-1]+f[max(i-k-1,0)])%mod;
printf("%d\n",f[n]);
return 0;
}
H : H: H:
https://www.luogu.org/problem/P2938
完全背包
#include<iostream>
#include<cstdio>
#include<ctype.h>
#include<cstring>
using namespace std;
inline int read(){
int x=0,f=0;
char ch=getchar();
while(!isdigit(ch))f|=ch=='-',ch=getchar();
while(isdigit(ch))x=x*10+(ch^48),ch=getchar();
return f?-x:x;
}
int a[57][17],f[500007];
int main(){
int s=read(),d=read(),m=read();
for(int i=1;i<=s;++i)for(int j=1;j<=d;++j)a[i][j]=read();
for(int k=2;k<=d;++k){
memset(f,0,sizeof f);
int mx=0;
for(int i=1;i<=s;++i){
for(int j=a[i][k-1];j<=m;++j){
f[j]=max(f[j],f[j-a[i][k-1]]+a[i][k]-a[i][k-1]);
mx=max(f[j],mx);
}
}
m+=mx;
}
printf("%d",m);
return 0;
}
I : I: I:
https://www.luogu.org/problem/P2941
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <queue>
#define min(x,y)(x<y?x:y)
#define re register
#define For(a,b,c) for(register int a = b;a <= c; a++)
#define IL inline
char xB[1 << 15], *xS = xB, *xT = xB;
#define getchar()(xS==xT&&(xT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xT)?0:*xS++)
using namespace std;
typedef long long LL;
IL int read() {
re int ret = 0; re bool flag = 0; re char c = getchar();
while ((c < '0') | (c > '9')) flag ^= !(c^'-'), c = getchar();
while ((c >= '0') & (c <= '9')) ret = (ret << 3) + (ret << 1) + (c^'0'), c = getchar();
return flag ? -ret : ret;
}
inline void Put(char * s) { puts(s); }
inline void Put(char c) { Put(&c); }
inline void Put(LL x) { char c[25] = {0}; sprintf(c, "%lld", x); Put(c); }
inline void Put(int x) { Put(x | 0LL); }
const int N = 500 + 10;
const int M = 25 * 1e4;
const int INF = 66666666;
int n, Low[N], Dfn[N], Nxt[M], Fir[N], To[M], Kind;
int Clock, Tot, Ql[N], Dis[N][N], Stack[N], Top, Ans;
IL void Add_edge(int x, int y) { Nxt[++Tot] = Fir[x], To[Tot] = y, Fir[x] = Tot; }
IL void init() {
n = read();
For(i, 1, n) {
int x = read(), y = read();
Add_edge(x, y);
Add_edge(y, x);
}
}
void Tarjan(int Now) {
Low[Now] = Dfn[Now] = ++Clock;
Stack[++Top] = Now;
for (int i = Fir[Now]; i; i = Nxt[i]) {
int Go = To[i];
if (!Dfn[Go]) {
Tarjan(Go);
Low[Now] = min(Low[Now], Low[Go]);
} else if (!Ql[Go])
Low[Now] = min(Low[Now], Dfn[Go]);
}
if (Low[Now] == Dfn[Now]) {
Ql[Now] = ++Kind;
while (Stack[Top] != Now) {
Ql[Stack[Top]] = Kind;
Top--;
}
Top--;
}
}
IL void solve() {
memset(Dis, 10, sizeof(Dis));
For(i, 1, n)
if (!Dfn[i])
Tarjan(i);
For(i, 1, n)
For(j, 1, n) {
int Val = read();
Dis[Ql[i]][Ql[j]] = min(Dis[Ql[i]][Ql[j]], Val);
}
int Tmp = 0;
Ans = INF;
For(i, 1, Kind) {
For(j, 1, Kind) {
if (i == j) continue;
Tmp += Dis[i][j];
}
Ans = min(Ans, Tmp);
Tmp = 0;
}
Put(Ans << 1);
}
int main(void) {
init();
solve();
return 0;
}
J : J: J:
https://www.luogu.org/problem/P2940
#include<bits/stdc++.h>
using namespace std;
int w, x, y, z, n;
int a[201][201], maxx = -10000000;
int main() {
cin >> n;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
cin >> a[i][j];
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j, w = 0, x = 0, y = 0, z = 0)
for (int k = 0; k < n; ++k) {
w += a[i][(j + k) % n];
x += a[(i + k) % n][j];
y += a[(i + k) % n][(j + k) % n];
z += a[(i - k + n) % n][(j + k) % n];
maxx = max(max(max(w, x), max(y, z)), maxx);
}
cout << maxx;
}
K : K: K:
https://www.luogu.org/problem/P1052
#include<iostream>
#include<ctype.h>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){
int x=0,f=0;char ch=getchar();
while(!isdigit(ch))f|=ch=='-',ch=getchar();
while(isdigit(ch))x=x*10+(ch^48),ch=getchar();
return f?-x:x;
}
int f[3007],a[207];
bool b[3007];
int main(){
int L=read(),s=read(),t=read(),m=read(),now=0,last=0;
for(int i=1;i<=m;++i)a[i]=read();
sort(a+1,a+m+1);
for(int i=1;i<=m;++i){
if(a[i]>a[i-1]+t+t)now+=t+t+(a[i]-a[i-1])%t;
else now+=a[i]-a[i-1];
b[now]=1;
}
if(L>now+t+t+1)L=now+t+t;
for(int i=1;i<=L+t;++i)f[i]=99999999;
for(int i=1;i<=L+t;++i){
for(int j=s;j<=t;++j){
if(i>=j)f[i]=min(f[i],f[i-j]+b[i]);
}
}
int minn=f[L];
for(int i=L+1;i<=L+t;++i)minn=min(minn,f[i]);
printf("%d",minn);
return 0;
}
L : L: L:
懒得写高精,所以还是 P y t h o n Python Python(注: P y t h o n 3 Python3 Python3)
mod = 10000000000000000000000000000000000000000000000000000000000000000000000
def qpow(a, b):
ans = 1
while b != 0:
if b & 1:
ans = (ans * a) % mod
b = b // 2
a = (a * a) % mod
return ans
a = input().split()
print(qpow(int(a[0]), int(a[1])))