当前位置: 首页 > news >正文

中山手机网站制作哪家好ps做网站学到什么程度

中山手机网站制作哪家好,ps做网站学到什么程度,免费模板下载简历,学校网站建设规范传送门:CF [前题提要]:其实这场打的不是很好.A题一个sb错误看不出来,50min后才过,B题上来就Wa了一发,C题用了没必要的线段树,D题刚开始被60诈骗,一直在想按位考虑.幸好赛时猜出了E,然后又猜出来D,本来掉大分变成上大分…但是这场前几题大都是猜猜题,所以本来不想写题解的.但是…传送门:CF [前题提要]:其实这场打的不是很好.A题一个sb错误看不出来,50min后才过,B题上来就Wa了一发,C题用了没必要的线段树,D题刚开始被60诈骗,一直在想按位考虑.幸好赛时猜出了E,然后又猜出来D,本来掉大分变成上大分…但是这场前几题大都是猜猜题,所以本来不想写题解的.但是一想到对于这种结论题,肯定没多少人解释证明结论,所以还是逼自己一把来写这玩意了… A. Dual Trigger 显然1的个数是奇数的时候是不合法的.那么现在只需要判断1的个数是偶数的时候.考虑只有两个1的时候,并且这两个1是相邻的时候是不满足要求的,其他偶数情况都是合法的. 考虑证明:对于只有两个1并且不相邻的情况,我们只要选择这两个1操作一次即可.对于 k k k个1,且 k k k是偶数的情况,我们每次都选择相对位置在第 i i i和第 ( i k / 2 ) (ik/2) (ik/2)位置的1,不难发现这种构造方式是合法的. #include bits/stdc.h using namespace std; typedef long long ll; #define root 1,n,1 #define ls (rt1) #define rs (rt1|1) #define lson l,mid,rt1 #define rson mid1,r,rt1|1 inline ll read() {ll x0,w1;char chgetchar();for(;ch9||ch0;chgetchar()) if(ch-) w-1;for(;ch0ch9;chgetchar()) xx*10ch-0;return x*w; } inline void print(__int128 x){if(x0) {putchar(-);x-x;}if(x9) print(x/10);putchar(x%100); } #define maxn 1000000 const double eps1e-8; #define int_INF 0x3f3f3f3f #define ll_INF 0x3f3f3f3f3f3f3f3f int main() {int Tread();while(T--) {int nread();string s;cins;vectorintv;for(int i0;is.length();i) {if(s[i]1) {v.push_back(i);}}if((int)v.size()1) {coutNOendl;}else {int cnt0;for(int i0;is.length();i) {if(s[i]1) {cnt;while(i1s.length()s[i1]1) {i;}}}if(cnt1(int)v.size()2) {coutNOendl;}else {coutYESendl;}}}return 0; }B. Battle Cows 感觉做法应该有很多.我的做法是考虑枚举每一个位置作为与 k k k交换的位置,然后求得每种情况的贡献最后取一个 m a x max max. 那么显然的,当我们枚举到第 i i i个奶牛,如果 i i i之前的所有奶牛的值比 k k k大,那此时已经被必要继续枚举下去了,因为对于 i i i以及 i i i之后的所有位置来说,无论我们怎么交换,最后的贡献都是0. 然后对于交换的位置我们考虑它的贡献是什么,对于前缀的贡献显然是1,因为前面都比它要小(对吗?不对,此时需要进行分类讨论,如果交换到的位置是第一个,那么此时前缀没有贡献,并且如果当前的a[i]a[k],ki,的时候,你会发现所有无前缀贡献也无后缀贡献,所以此处需要进行分类讨论).那么对于后缀的贡献来说,显然是交换后(也就是当前位置是 i i i)后续第一个比它大的数的位置.考虑如何维护这个,只要提前用 s e t set set记录所有比k大的数位置,如果当前的 i i i在其中,先将其删除,求完贡献之后再插入即可.如果不在直接查即可.感觉凭空说比较麻烦,直接看代码理解或许会更好 #include bits/stdc.h using namespace std; typedef long long ll; #define root 1,n,1 #define ls (rt1) #define rs (rt1|1) #define lson l,mid,rt1 #define rson mid1,r,rt1|1 inline ll read() {ll x0,w1;char chgetchar();for(;ch9||ch0;chgetchar()) if(ch-) w-1;for(;ch0ch9;chgetchar()) xx*10ch-0;return x*w; } inline void print(__int128 x){if(x0) {putchar(-);x-x;}if(x9) print(x/10);putchar(x%100); } #define maxn 1000000 const double eps1e-8; #define int_INF 0x3f3f3f3f #define ll_INF 0x3f3f3f3f3f3f3f3f int a[maxn];int lmax[maxn]; int main() {int Tread();while(T--) {int nread();int kread();for(int i1;in;i) {a[i]read();lmax[i]max(lmax[i-1],a[i]);}setintst;for(int i1;in;i) {if(a[i]a[k]) {st.insert(i); }}st.insert(n1);//注意边界问题int ans0;for(int i1;in;i) {if(lmax[i-1]a[k]) {break;}if(a[i]a[k]) {if(ki) continue;st.erase(i);st.insert(k);auto posst.lower_bound(i);if(i1) {ansmax(ans,*pos-i-1);}else {ansmax(ans,1*pos-i-1);}st.erase(k);st.insert(i);}else {auto posst.lower_bound(i);if(i1) {ansmax(ans,*pos-i-1);}else {ansmax(ans,1*pos-i-1);}}}coutansendl; }return 0; }C. Ticket Hoarding 赛时没有细想,想了个自以为很正确的贪心过了样例就交了.赛后发现这道题证明起来还是挺麻烦的. 先讲做法,就是贪心地取便宜的东西,然后尽量的将其拿满 m m m个(显然最后一次是拿k%m),考虑如何维护这个东西,我是拿线段树进行维护的.假设你当前枚举到的是第 i i i个,那么这个东西现在的单价上升的数值等同于之前拿的 i d id id在其之前的个数.然后你拿了这个东西,同样会影响之前拿的所有 i d id id在其之后的东西.具体关系很好推,就不赘述了(不会看具体代码也应该能理解).那么现在我们的问题就是如何维护 i d id id在当前之前的东西的个数以及在当前之后的东西的个数,这个可以使用权值线段树或者权值树状数组维护. 那么为什么上述贪心是正确的呢.下面来简单证明一下: 考虑设数组 a a a表示 1 1 1~ n n n每一个物品买的个数;数组 b b b表示每一个的原始单价.那么对于当前的第 i i i个物品,此时它的真实购买价格就是 ∑ j 1 i − 1 a j b i \sum_{j1}^{i-1}{a_j}b_i ∑j1i−1​aj​bi​,那么此时的总价格就是 ∑ i 1 n ( ( ∑ j 1 i − 1 a j b i ) ∗ a i ) \sum_{i1}^{n}((\sum_{j1}^{i-1}{a_j}b_i)*a_i) ∑i1n​((∑j1i−1​aj​bi​)∗ai​),化简一下不难发现就是下面这个东西 ∑ i 1 n a i b i ∑ a i a j [ i ≠ j ] \sum_{i1}^{n}a_ib_i\sum a_ia_j[{i\neq j}] ∑i1n​ai​bi​∑ai​aj​[ij],发现后面那个式子只跟a有关,所以我们考虑对于固定数字的a数组来说,我们可以随意交换其位置,对于后面答案是没有影响的.但是显然的对于前面的式子来说,我们将a中大的数与b中小的数搭配才是最优的,那么显然的,我们此时假设b数组是单调增的,我们应该尽量的将前的每一个位置都填满对于前面的式子来说贡献才是最小的.也就是a数组此时的值应该为 [ m , m . . . , k % m , . . . , 0 , 0 , 0 ] [m,m...,k\%m,...,0,0,0] [m,m...,k%m,...,0,0,0].但是这个只是对于前面的式子来说是最优的,我们后面的式子该怎么办呢.其实可以证明上述这种贪心策略同样适用于后面的式子. 对于 ∑ a i a j [ i ≠ j ] \sum a_ia_j[{i\neq j}] ∑ai​aj​[ij],我们将其换个方式表示 ( ∑ i 1 n a i ) 2 − ∑ i 1 n a i 2 (\sum_{i1}^{n}a_i)^2-\sum_{i1}^na_{i}^2 (∑i1n​ai​)2−∑i1n​ai2​,不难发现 ∑ a i \sum{a_i} ∑ai​是固定的.所以就是后面那个式子尽量的取最大.对于平方和来说,什么时候取最大呢,显然是最不平均的时候(这个应该是可以使用某个基础的不等式证明的,太久没学数学了,忘了,就不证明了),而我们上述的分法刚好是最不平均的分法. #include bits/stdc.h using namespace std; typedef long long ll; #define root 1,n,1 #define ls (rt1) #define rs (rt1|1) #define lson l,mid,rt1 #define rson mid1,r,rt1|1 inline ll read() {ll x0,w1;char chgetchar();for(;ch9||ch0;chgetchar()) if(ch-) w-1;for(;ch0ch9;chgetchar()) xx*10ch-0;return x*w; } inline void print(__int128 x){if(x0) {putchar(-);x-x;}if(x9) print(x/10);putchar(x%100); } #define maxn 1000000 #define int long long const double eps1e-8; #define int_INF 0x3f3f3f3f #define ll_INF 0x3f3f3f3f3f3f3f3f struct Segment_tree{int l,r,mn,mx,sum; }tree[maxn2]; void pushup(int rt) {tree[rt].mnmin(tree[ls].mn,tree[rs].mn);tree[rt].mxmax(tree[ls].mx,tree[rs].mx);tree[rt].sumtree[ls].sumtree[rs].sum; } void build(int l,int r,int rt) {tree[rt].ll;tree[rt].rr;tree[rt].mnint_INF;tree[rt].mx-int_INF;tree[rt].sum0;if(lr) {return ;}int mid(lr)1;build(lson);build(rson);pushup(rt); } void update(int pos,int rt,int val) {if(tree[rt].lpostree[rt].rpos) {tree[rt].mntree[rt].mxval;tree[rt].sumval;return ;}int mid(tree[rt].ltree[rt].r)1;if(posmid) update(pos,ls,val);else update(pos,rs,val);pushup(rt); } int query_min(int l,int r,int rt) {if(tree[rt].lltree[rt].rr) {return tree[rt].mn;}int mid(tree[rt].ltree[rt].r)1;if(rmid) return query_min(l,r,ls);else if(lmid) return query_min(l,r,rs);else return min(query_min(l,mid,ls),query_min(mid1,r,rs)); } int query_max(int l,int r,int rt) {if(tree[rt].lltree[rt].rr) {return tree[rt].mx;}int mid(tree[rt].ltree[rt].r)1;if(rmid) return query_max(l,r,ls);else if(lmid) return query_max(l,r,rs);else return max(query_max(l,mid,ls),query_max(mid1,r,rs)); } int query(int l,int r,int rt) {if(tree[rt].lltree[rt].rr) {return tree[rt].sum;}int mid(tree[rt].ltree[rt].r)1;if(rmid) return query(l,r,ls);else if(lmid) return query(l,r,rs);else return query(l,mid,ls)query(mid1,r,rs); } struct Node{int val,id;bool operator (const Node rhs) const {return valrhs.val;} }node[maxn]; signed main() {int Tread();while(T--) {int nread();int mread();int kread();build(1,n,1);for(int i1;in;i) {node[i].valread();node[i].idi;}sort(node1,noden1);int ans0;for(int i1;in;i) {if(km) {int numquery(node[i].id,n,1);int num2query(1,node[i].id,1);ans(node[i].valm*num2)*mnum*m*m;k-m;update(node[i].id,1,1);}else {int numquery(node[i].id,n,1);int num2query(1,node[i].id,1);ans(node[i].valm*num2)*knum*m*k;break;}}coutansendl;}return 0; }D. Buying Jewels 猜猜题.经典先猜后证 显然我们会发现当nk的时候我们的答案是NO,因为我们至少也要花1换取1个东西. 当nk时候,显然只要设置金额是1即可 当nk的时候,显然此时1号摊位不能设置1,然后我们经过某种神奇的思考(或者手模几个样例找找规律).例如20,9,此时的答案是12,1,就会发现我们可以设置1号摊位为 n − k 1 n-k1 n−k1,然后二号摊位为 1 1 1,这样似乎就可以了?因为我们发现只要我们给2号摊位剩下k-1块钱,然后1号摊位用掉n-k1块钱并获得1贡献即可.但是上述这种方法是有范围限制的.我们发现当 n / ( n − k 1 ) 1 n/(n-k1)1 n/(n−k1)1的时候,就会出问题,例如8,4.然后就会想这个时候该怎么构造呢?其实这个时候的答案就是NO.考虑简单证明一下这个. 因为我们此时的1号摊位不能是1了,那么此时我们能获得的最大物品数显然是 ⌊ n 2 ⌋ n % 2 \lfloor \frac{n}{2}\rfloorn\%2 ⌊2n​⌋n%2,考虑 n / ( n − k 1 ) 1 n/(n-k1)1 n/(n−k1)1是什么情况,因为是整数,所以我们可以将其改写为 n ≥ 2 ∗ ( n − k 1 ) n \geq 2*(n-k1) n≥2∗(n−k1),化简一下就会发现 2 ∗ k − 2 ≥ n 2*k-2\geq n 2∗k−2≥n,也就是 k ≥ ⌈ n 2 2 ⌉ k\geq\lceil\frac{n2}{2}\rceil k≥⌈2n2​⌉,然后我们会发现什么,我们会发现此时的 ⌈ n 2 2 ⌉ ⌊ n 2 ⌋ n % 2 \lceil\frac{n2}{2}\rceil\lfloor \frac{n}{2}\rfloorn\%2 ⌈2n2​⌉⌊2n​⌋n%2(这个可以通过分类n的奇偶性证明).这说明了什么,说明了这种情况下我们获得最大物品数都不及k,所以必然不可能得到一个可行解.所以此时的答案必然是NO #include bits/stdc.h using namespace std; typedef long long ll; #define root 1,n,1 #define ls (rt1) #define rs (rt1|1) #define lson l,mid,rt1 #define rson mid1,r,rt1|1 inline ll read() {ll x0,w1;char chgetchar();for(;ch9||ch0;chgetchar()) if(ch-) w-1;for(;ch0ch9;chgetchar()) xx*10ch-0;return x*w; } inline void print(__int128 x){if(x0) {putchar(-);x-x;}if(x9) print(x/10);putchar(x%100); } #define maxn 1000000 #define int long long const double eps1e-8; #define int_INF 0x3f3f3f3f #define ll_INF 0x3f3f3f3f3f3f3f3f signed main() {int Tread();while(T--) {int nread();int kread();if(n%k0) {coutYESendl;cout1endl;coutn/kendl;continue;}if(nk) {if(n/(n-k1)1) {coutYESendl;cout2endl;coutn-k1 1endl;continue;}}coutNOendl;}return 0; }E. No Palindromes 猜猜题.经典先猜后证 赛时想了一下,直觉告诉我能分成2个以上的非回文串的难度应该是大于分成两个非回文串的难度的.所以当时直接钦定只能分成两个非回文串,然后使用 M a n a c h e r Manacher Manacher判断回文串.没想到真给我过了,当时很怕被FST,结果正解还真是这个… 考虑证明下面这个结论:如果一个字符串能分成若干个非回文子串,那么一定可以通过分成两段的方式来满足该题意. 首先我们会发现如果一个字符串S,它本身就是非回文串,那么我们直接输出它即可.那么下面的讨论将基于S是回文串开始讨论. 对于一个非回文串来说,我们首先应该想到如果一个子串的两个端点不同,那么它显然就是一个非回文串那么假设我们存在 S ( 1 , p o s ) S(1,pos) S(1,pos)满足 S [ 1 ] ! S [ p o s ] S[1]!S[pos] S[1]!S[pos],那么只要 S [ p o s 1 , n ] S[pos1,n] S[pos1,n]不是一个回文串,我们就可以直接把上述两个子串当做我们此时的答案.并且我们会发现此时满足分成两个子串的结论 那么假设不存在上述这种情况该怎么办呢.考虑不存在上述情况,我们的S会是什么形式. 首先可能我们的S只有一个字符,此时这种情况是不能分成两个非回文子串的.但是此时确确实实应该是NO.所以与上述结论不矛盾. 那么此时我们的S有多个字符,我们会发现S一定是AbAbAb…AbAbA这种形式.其中A是若干个相同的字符,b是一个字符.我们考虑从后往前枚举,那么最后一个b显然是一个位置与开头不同的端点,所以此时最后一个A一定是多干个相同的字符(我们此时假设所有的A我们不知道他们是相同的,b也不知道是相同的).我们继续枚举,到倒数第二个b,我们会发现,此时需要AbA需要是一个回文串,因为A中的字符和b不同,所以倒数第二个A一定和最后一个A相同.所以倒数第二个A也是若干个相同字符.类似的枚举到倒数第三个b,我们会发现后两个b一定相同.并且因为S是一个回文串,我们最后能得到最后一个A和开头的A也是相同的,那么我们可以根据不完全归纳法得出上述这种形式是正确的. 很好,那么此时我们考虑根据A的字符的个数来进行枚举.不难发现,当A中的字符个数是1个时,此时的A是ababababa这种形式,我们无法将其分为两个非回文子串,但是我们此时也会发现该字符本就无法分成多个非回文子串;考虑当A中的字符个数大于1时(假设有t个),我们假设a是A的单个字符,我们只要将其分为 A b a Aba Aba以及 a a a . . . a a a b A b A aaa...aaabAbA aaa...aaabAbA的两个子串即可.其中第二子串的开头是 t − 1 t-1 t−1个a.第一个子串的结尾是1个a.我们会发现这种构造必然是两个非回文子串,因为两个子串开头和结尾的a的个数不同. 至此,证毕. #include bits/stdc.h using namespace std; typedef long long ll; #define root 1,n,1 #define ls (rt1) #define rs (rt1|1) #define lson l,mid,rt1 #define rson mid1,r,rt1|1 inline ll read() {ll x0,w1;char chgetchar();for(;ch9||ch0;chgetchar()) if(ch-) w-1;for(;ch0ch9;chgetchar()) xx*10ch-0;return x*w; } inline void print(__int128 x){if(x0) {putchar(-);x-x;}if(x9) print(x/10);putchar(x%100); } #define maxn 1000000 const double eps1e-8; #define int_INF 0x3f3f3f3f #define ll_INF 0x3f3f3f3f3f3f3f3f class Manacher { public:Manacher(const std::string s) {construct(s);};void getLongestPalindromeString(int position, int length) {// 找到最长的回文子串的位置与长度。position -1, length -1;for(int i 0; i len.size(); i) {if(len[i] length) {length len[i];position i;}}// 映射到原始字符串中的位置。position position/2 - length/4;length length/2;return;}// s[L:R] 是否是回文的bool isPalindrome(int L, int R) {L L*2 1;R R*2 1;int mid (LR)/2;if(0 mid mid len.size() R-L1 len[mid]) {return true;}return false;} private:vectorint len;void construct(const std::string s) {vectorchar vec;// 用 0 作为分隔符vec.resize(s.size()*21);for(int i 0; i s.size(); i) {vec[i1|1] s[i];}int L 0, R -1;len.resize(vec.size());for(int i 0, n vec.size(); i n; i) {if(i R) { // 被覆盖了尝试加速len[i] min((R-i)*21, len[LR-i]);} else { // 未被覆盖那就没办法加速了从 1 开始。len[i] 1;}// 尝试继续探测int l i - len[i]/2 - 1;int r i len[i]/2 1;while(0 l r vec.size() vec[l] vec[r]) {--l;r;}// 更新len[i] r-l-1;if(r R) {L l1;R r-1;}}} }; int main() {cin.sync_with_stdio(false);cin.tie();cout.tie();int T;cinT;while(T--) {string s;cins;int ns.length();s s;Manacher Ma(s);if(!Ma.isPalindrome(1,n)) {coutYESendl;cout1endl;couts.substr(1)endl;continue;}int flag0;string ans1,ans2;for(int i1;in;i) {if(!Ma.isPalindrome(1,i)!Ma.isPalindrome(i1,n)) {ans1s.substr(1,i);ans2s.substr(i1);flag1;break;}}if(flag) {coutYESendl;cout2endl;coutans1 ans2endl;}else {coutNOendl;}}return 0; }
http://www.dnsts.com.cn/news/257459.html

相关文章:

  • 网站设计 趋势全球华设计大奖
  • 关于申请网站建设经费的报告网站推广的营销策划方案
  • 连云港网站建设优化广告设计软件免费下载
  • apache如何搭建多个网站wordpress文件调用
  • 专业优化网站建设昭通网站建设
  • 宁波企业网站seo主流网站开发平台
  • 无广告自助建站网站备案万网
  • wordpress+单页模版上海优化seo
  • 建房子找哪个网站设计顺企网网址
  • 重庆网站制作公司多少钱帮助人做ppt的网站
  • 强生公司营销网站为什么要这样做网页设计考试题目
  • 武进网站建设价格广东专业网站优化制作公司
  • 冠县网站建设gxsh免费下载模板的网站有哪些
  • 境外网站建设wordpress外链转跳页面
  • 网站建设使用哪种语言好全国行业名录搜索系统官网
  • 仙桃企业网站建设服装印花图案网站
  • 网站上传小马后怎么做小说网站建设教程
  • 网站建设国内外研究现状模板网站建设友汇
  • 网站首页添加浮动飘窗怎么查询网站ftp地址
  • 云南省科技网站项目建设资金来源网站
  • 贺州网站制作搜索引擎优化与推广的产生及发展
  • tomcat做网站wordpress m编辑器
  • py网站开发室内设计师个人网站
  • 北京 网站 优化wordpress啥意思
  • 网站打开一片空白中山网站建设联系电话
  • 建设网站的课题中国免费素材网站
  • 虚拟主机多网站北京网络建设公司
  • 李静做的化妆品网站wordpress插件 地图
  • 网站的栏目建设在哪里建立个人博客网站
  • 网站方案建设书企业所得税怎么缴纳