本周的主要学习内容还是数论,除了素数、公因数等问题,特别注意大指数的降幂,详见ppt;
本周因为回了老家,参加的cf场数较少,看起来下周比赛较少,而且本周难得cf的时间都比较正常,太遗憾了。
以后一定要多多参加,防止挂科,唉。家长安排,没办法,再蹲家里就要被赶出去了,等开学一定要好好学习。
协会的vj竟然忘了。在家呆的太混了。
另外,总结一下参加的那一场div3 cf:
1、感觉还是div2上分容易,至少不会太惨。两题魔咒,唉。就算div3多做出一个题还是掉分,马上就破1300了
2、不管怎么说,主要是为了学习,也不能太在意分数。目前参加的比赛还是太少了,前三题一般能有思路,但是往往会碰到一些莫名其妙的WA,或者读题出现问题,导致一些错误的提交乃至直接无法通过。这点需要着力。目前来看前三题解出的希望还是很大的。
3、侧重分析第四题
D. Constructing the Array
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
You are given an array a of length n consisting of zeros. You perform n actions with this array: during the i-th action, the following sequence of operations appears:
Choose the maximum by length subarray (continuous subsegment) consisting only of zeros, among all such segments choose the leftmost one;
Let this segment be [l;r]. If r−l+1 is odd (not divisible by 2) then assign (set) a[l+r2]:=i (where i is the number of the current action), otherwise (if r−l+1 is even) assign (set) a[l+r−12]:=i.
Consider the array a of length 5 (initially a=[0,0,0,0,0]). Then it changes as follows:
Firstly, we choose the segment [1;5] and assign a[3]:=1, so a becomes [0,0,1,0,0];
then we choose the segment [1;2] and assign a[1]:=2, so a becomes [2,0,1,0,0];
then we choose the segment [4;5] and assign a[4]:=3, so a becomes [2,0,1,3,0];
then we choose the segment [2;2] and assign a[2]:=4, so a becomes [2,4,1,3,0];
and at last we choose the segment [5;5] and assign a[5]:=5, so a becomes [2,4,1,3,5].
Your task is to find the array a of length n after performing all n actions. Note that the answer exists and unique.
You have to answer t independent test cases.
Input
The first line of the input contains one integer t (1≤t≤104) — the number of test cases. Then t test cases follow.
The only line of the test case contains one integer n (1≤n≤2⋅105) — the length of a.
It is guaranteed that the sum of n over all test cases does not exceed 2⋅105 (∑n≤2⋅105).
Output
For each test case, print the answer — the array a of length n after performing n actions described in the problem statement. Note that the answer exists and unique.
当时还剩半小时(第二题理解错误,错误提交好几次),个人分析完还以为是递归问题,牵涉到算法还是太菜了,以后要侧重学习数据结构
#include <bits/stdc++.h>
using namespace std;
struct cmp {
bool operator() (const pair<int, int> &a, const pair<int, int> &b) const {
int lena = a.second - a.first + 1;
int lenb = b.second - b.first + 1;
if (lena == lenb) return a.first < b.first;
return lena > lenb;
}
};
int main() {
#ifdef _DEBUG
freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
set<pair<int, int>, cmp> segs;
segs.insert({0, n - 1});
vector<int> a(n);
for (int i = 1; i <= n; ++i) {
pair<int, int> cur = *segs.begin();
segs.erase(segs.begin());
int id = (cur.first + cur.second) / 2;
a[id] = i;
if (cur.first < id) segs.insert({cur.first, id - 1});
if (id < cur.second) segs.insert({id + 1, cur.second});
}
for (auto it : a) cout << it << " ";
cout << endl;
}
return 0;
}
官方题解,自己是绝对写不出来的
以后可以考虑先把穷举解决出来,然后再优化
还有,学学数据结构