qaq 迷の卡常數的一天 qaq
第一題裸的多重揹包,果斷寫單調佇列
20min拍上,分析時間複雜度o(t*n*m),感覺根本不虛
然後就被卡常數了,然後出題人喪心病狂把我卡成了60分
(評測機太渣渣了qaq話說改成3s我就a了啊qaq)
不過貌似就算a了 我還是rank4
單調佇列的做法就不再說了
然後a掉的人有各種鬼畜做法,什麼二進位制分組維護個鍊錶優化常數。。
對於這道題來說有個性質是揹包的重量和價值是一樣的
我們只需要看前i個物品能否完成拼出j的重量就可以了,這樣做bool變數的dp
同時可以去掉單調佇列,只需要知道可轉移的區間中是否有true就可以了qaq隨便拿個cnt都能記錄
然後這樣常數就小了很多(雖然時間複雜度還是一樣的,鑑於出題人就是想卡常數,所以。。)
貼單調佇列的**qaq
#include#include#include#include#include#define fastcall __attribute__((optimize("-o3")))#define il __inline__ __attribute__((always_inline))
using namespace std;
typedef long long ll;
const int maxn=310;
int t,n,m,mx;
int l,r,k;
struct icec[maxn];
int h,t;
struct queq[10010];
int f[310][10010];
int ans[310][10010];
fastcall il void read(int &num)
fastcall il int max(int a,int b)
//f[i][j]=max(f[i-1][j-num*w]+num*v)
int main()}}
for(int i=1;i<=n;++i)
}while(m--)
}return 0;
}
第二題先spfa搞出每個點可能的最大電勢(就是最短路)
然後可轉移的點連邊,顯然是個拓撲圖,由於每個自爆怪都是獨立的
搞出每個點的sg值就可以了,隨便拓撲排序或者記憶化都可以
最後所有怪異或起來就是答案
#include#include#include#include#include#includeusing namespace std;const int maxn=20010;
const int oo=0x7fffffff/3;
int t,n,m,k;
int u,v,w;
int h[maxn],cnt=0;
int tot=0;
int dis[maxn];
int deg[maxn];
int lis[maxn],sum=0;
int sg[maxn],check[maxn],tim=0;
bool vis[maxn];
struct edgeg[500010];
struct edgec[100010];
queueq;
void add(int x,int y,int z=0)
void read(int &num)
void spfa()
}vis[u]=false;
}return;
}void build_graph()}}
memset(deg,0,sizeof(deg));
memset(h,0,sizeof(h));cnt=0;
for(int i=1;i<=tot;++i)add(c[i].u,c[i].v),deg[c[i].v]++;
}void toposort()
}return;
}void get_sg()
if(flag)
for(int j=0;j!=-1;j++)
}}return;}
int main()
spfa();build_graph();
toposort();get_sg();
int ans=0;
while(k--)
if(!ans)printf("other\n");
else printf("qq\n");
}return 0;
}
第三題考場上絲薄了,沒有想出來
原因是沒有仔細觀察模數的性質,首先如果模數很小我們維護一顆線段樹每次列舉進入的數是多少完成區間合併就可以了
所以當模數是17的時候非常好做
然後給的這個模數非常的鬼畜,我一直以為是個質數,所以百思不得其解
他實際上是11*13*17*19
那麼做法就非常顯然了,你對於這四個模數分別維護線段樹,最後得到四個答案crt即可
出題人給了個5000的暴力範圍完全不知道出題人在想些什麼(難道乘方操作可以預處理省個log?)
這個題目我們把模數擴大而且是個質數,但是減掉一些操作我們還是可以做的:
1、去掉乘方,我們把每個區間用kx+b來表示,維護線段樹或者平衡樹即可
2、去掉加、減,我們對模數搞出原根,之後對所有的操作取模意義下的log,最後快速冪回去即可
但是至今想不出來如果什麼都不去怎麼做qaq
#include#include#include#include#includeusing namespace std;
typedef long long ll;
const int maxn=100010;
int n,m,type,x,a;
char b;
char ch[maxn];
int num[maxn];
int m[4];
int pow_mod(int v,ll p,int mod)return tmp;
}struct seg_tree{
int ans[maxn<<2][20];
void build(int o,int l,int r,int mod){
if(l==r){
for(int i=0;i>1;
build(o<<1,l,mid,mod);
build(o<<1|1,mid+1,r,mod);
int l=(o<<1),r=(o<<1|1);
for(int i=0;i>1;
if(p<=mid)modify(o<<1,l,mid,p,mod);
else modify(o<<1|1,mid+1,r,p,mod);
int l=(o<<1),r=(o<<1|1);
for(int i=0;i今天考試總結:
1、沒有想到oj的評測機那麼慢qaq(理論上6000w的複雜度要跑3s)
2、對於模數的一類關於crt的解題方式不敏感(或者根本就不知道)
3、缺少對於模數的觀察,想當然以為模數是個質數
如果考場能看出模數是若干很小質數的乘積的話就很容易得到思路了
一開始總想著用什麼資料結構直接維護,結果就只能寫50分的暴力qaq
思考的時候一直沒有嘗試著轉換思路,而是轉換資料結構
思路閉塞也是自己的一大弱點,貌似最近被壓rank都是自己有一道題目a不掉?上面的人都a掉了qaq
還有一些無關演算法的坑:進軍tc qaq 學習emacs(不過是回衡中以後的事情啦)
5 31考試總結
8知8覺 又到了月底了這個月低保還沒打呢 然後這次在學校集訓 連著兩天都要考試 有點難受 t1 給出乙個正整數 n,現在問存在多少個 x,使得 x在十進位制下的每一位之和加上 x 等於 n 說實話剛看到這題感覺蠻簡單的 老劉也說是簽到題 但資料有10 9啊 然後我想到了乙個奇奇怪怪的思路 就是利用前...
6 15 考試修改 總結
昨天考崩了qaq 幾乎寫全了暴力分,然而並沒有什麼卵用 因為只要a掉一道題就比我分高了,比我分高的也至少a掉了一道題qaq 感覺到一絲淡淡的憂桑 貌似thusc最後聽講課的那些人幾乎都a了兩題 看來我的thusc果然只是rp好啊 第一題顯然選色數最少的顏色,設顏色數為m 考慮存在某個點的方案數,設這...
5 27 考試修改 總結
這是乙個悲傷的故事 上午寫manacher的時候往裡面加 號,然後統計有效字元的個數 然後我就開始模擬,乙個長度為6的串我都能數錯有多少個有效字元 我把2個字元數成了3個!然後暴力就掛掉了5分。為什麼這幾天的暴力總是會掛掉,真是奇怪 看來是最近自己內心不太穩了 大概是被那個夢嚇得吧qaq 今天又a了...