D 枚举转化
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[2][20];
ll n;
int main(){
scanf("%lld",&n);a[0][0]=1;ll c=n;ll b=0;
for(int i=1;i<=n;i++){
scanf("%lld",&a[0][i]);
}
int now=0;
while(n>0){
int flag=1;
for(ll i=-10;i<=10;i++){
ll ans=0;
for(ll j=0;j<=n;j++){
ans+=pow(i,(n-j))*a[now][j];
}
if(ans==0){
//cout<<"i= "<<i<<endl;
flag=0;n--;a[now^1][0]=a[now][0];
for(int k=1;k<=n;k++){
a[now^1][k]=a[now][k]+i*a[now^1][k-1];
}
now^=1;b++;break;
}
}
if(flag) break;
}
printf("%lld\n",c-b);
}
/**************************************************************
Problem: 1706
User: ALPC_t_1
Language: C++
Result: Accepted
Time:0 ms
Memory:1496 kb
****************************************************************/
F:枚举加多项式除法
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[2][20];
ll n;
int main(){
scanf("%lld",&n);a[0][0]=1;ll c=n;ll b=0;
for(int i=1;i<=n;i++){
scanf("%lld",&a[0][i]);
}
int now=0;
while(n>0){
int flag=1;
for(ll i=-10;i<=10;i++){
ll ans=0;
for(ll j=0;j<=n;j++){
ans+=pow(i,(n-j))*a[now][j];
}
if(ans==0){
//cout<<"i= "<<i<<endl;
flag=0;n--;a[now^1][0]=a[now][0];
for(int k=1;k<=n;k++){
a[now^1][k]=a[now][k]+i*a[now^1][k-1];
}
now^=1;b++;break;
}
}
if(flag) break;
}
printf("%lld\n",c-b);
}
/**************************************************************
Problem: 1706
User: ALPC_t_1
Language: C++
Result: Accepted
Time:0 ms
Memory:1496 kb
****************************************************************/
I
map
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e6+5;
//short int a[maxn];int n,k;
int n,k;map<int,int>m;
int main(){
scanf("%d%d",&n,&k);int b;
for(int i=1;i<=n;i++){
scanf("%d",&b);m[b]++;
}
for(map<int,int>::iterator it =m.begin();it!=m.end();it++){
if((*it).second%k!=0){
printf("%d\n",*it);return 0;
}
}
}
/**************************************************************
Problem: 1709
User: ALPC_t_1
Language: C++
Result: Accepted
Time:24 ms
Memory:1756 kb
****************************************************************/
H:忘记处理有的座位没有卖票的情况了,这样所有站最远都可以直接到达n,少push了,坑了我这么久,哎,还是写的太残了
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+5;
int n,t,k;
struct node{
int a,b,c;
}aa[maxn];
struct Node{
int a,b;
}bb[maxn];
vector<Node>vec;
bool Cmp(Node x,Node y){
return x.b>y.b;
}
int f1[maxn],f2[maxn];
bool cmp(node x,node y){
if(x.a==y.a){
if(x.b==y.b) return x.c<y.c;
return x.b<y.b;
}
return x.a<y.a;
}
int vis[maxn], lv[maxn];
int main(){
//freopen("007.in","r",stdin);
scanf("%d%d%d",&k,&n,&t);memset(vis,0,sizeof(vis));
for(int i=1;i<=t;i++){
scanf("%d%d%d",&aa[i].a,&aa[i].b,&aa[i].c);
vis[aa[i].a]=1;
}
for(int i=1;i<=n;i++){
f2[i]=i;f1[i]=i;
}
sort(aa+1,aa+1+t,cmp);int count=0;
aa[0].a=0;aa[t+1].a=0;
for(int i=1;i<=t;i++){
vis[aa[i].a]=1;
if((aa[i].a!=aa[i-1].a)&&aa[i].b>1){
vec.push_back(Node{1,aa[i].b});
}
if(aa[i].a==aa[i+1].a&&(aa[i].c<aa[i+1].b)){
vec.push_back(Node{aa[i].c,aa[i+1].b});
}
if((aa[i].a!=aa[i+1].a)&&(aa[i].c<n)){
vec.push_back(Node{aa[i].c,n});
}
}
for(int i=1;i<=k;i++){
if(!vis[i]){
vec.push_back(Node{1,n});
}
}
sort(vec.begin(),vec.end(),Cmp);
int now=(int)vec.size();
for(int i=0;i<vec.size();i++){
for(int j=vec[i].b;j>=vec[i].a;j--){
f1[j]=max(f1[j],vec[i].b);
f2[j]=max(f2[j],f2[f2[vec[i].b]]);
}
}
ll ans=0;
for(int i=1;i<=n;i++){
ans+=(f2[i]-f1[i]);
}
printf("%lld\n",ans);
}
/**************************************************************
Problem: 1708
User: ALPC_t_1
Language: C++
Result: Accepted
Time:164 ms
Memory:5404 kb
****************************************************************/
E:
最短路加状压dp,用优先队列优化,随机T~~~
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int inf=0x7f7f7f7f;
const int maxn=2e4+10;
int n,m,op,u,v,w,cost,num;
struct node{
int v,w;
bool operator < (const node & a ) const{
return w>a.w;
}
};
vector<node>a[maxn];priority_queue<node>q;
int p[maxn],dis[20][maxn];int vis[maxn];
int dp[1<<16][16][4];
void bfs(int x){
for(int i=0;i<n;i++){
dis[x][i]=inf;vis[i]=0;
}
dis[x][p[x]]=0;
q.push(node{p[x],0});
while(!q.empty()){
node now=q.top();q.pop();
if(vis[now.v]) continue ;vis[now.v]=1;
for(int i=0;i<a[now.v].size();i++){
int v=a[now.v][i].v;
if(dis[x][v]>dis[x][now.v]+a[now.v][i].w){
dis[x][v]=dis[x][now.v]+a[now.v][i].w;
q.push(node{v,dis[x][v]});
}
}
}
}
int solve(){
for(int i=0;i<=num;i++){
bfs(i);
}
for(int i=0;i<(1<<num);i++){
for(int j=0;j<num;j++){
for(int k=0;k<4;k++){
dp[i][j][k]=inf;
}
}
}
for(int i=0;i<num;i++){
dp[1<<i][i][0]=dis[num][p[i]]+cost;
}
for(int i=1;i<(1<<num);i++){
for(int j=0;j<num;j++){
if(!(i&(1<<j))) continue;
for(int c=0;c<4;c++){
if(dp[i][j][c]==inf) continue;
for(int k=0;k<num;k++){
if(i&(1<<k)) continue;
int st=i|(1<<k);
dp[st][k][0]=min(dp[st][k][0],dp[i][j][c]+dis[num][p[k]]+cost);
if(c<3){
dp[st][k][c+1]=min(dp[st][k][c+1],dp[i][j][c]+dis[j][p[k]]);
}
}
}
}
}
int ans=inf;
int st=(1<<(num))-1;
for(int i=0;i<num;i++){
for(int j=0;j<=3;j++){
ans=min(ans,dp[st][i][j]);
}
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&op,&u,&v,&w);u--;v--;
a[u].push_back(node{v,w});
if(op==2) a[v].push_back(node{u,w});
}
int st;
scanf("%d%d%d",&cost,&st,&num);st--;
for(int i=0;i<num;i++){
scanf("%d",&p[i]);p[i]--;
}
p[num]=st;
int ans=solve();
printf("%d\n",ans);
}