1.签到
#include<iostream>
using namespace std;
typedef long long LL;
void solve()
{
int n;
cin >> n;
for(int i = 1;i <= 3 * 6;i ++){
if(i <= n){
cout << 1;
if(i % 6 == 0) cout << endl;
}
else {
cout << 0;
if(i % 6 == 0) cout << endl;
}
}
}
int main()
{
int t;
//cin >> t;
t = 1;
while(t --) solve();
return 0;
}
B,D一样
第一次被常!!!
一开始写寄了,想着x只会对旁边x - 3 ,x + 3 做出贡献,然后我就想着每次记录贡献,然后用树状数组求和,然后常数大了
O(2e5 * 3log
1
e
5
1e^5
1e5) = O(过不了)生气
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e5 + 5;
int tr[N];
int m,q;
int a[N],b[N];
int lowbit(int x)
{
return x & -x;
}
void update(int x,int c)
{
for(int i = x;i <= m;i += lowbit(i)) tr[i] += c;
}
int query(int x)
{
int sum = 0;
for(int i = x;i; i -= lowbit(i)) sum += tr[i];
return sum;
}
void solve()
{
cin >> m >> q;
while(q --){
int op,num;
cin >> op >> num;
if(op == 1){
int l = max(0,num - 3);
int r = min(m + 1,num + 3);
b[l] ++;
b[r] ++;
//如果是第一次就加加;
if(b[l] == 1) update(l,1);
if(b[r] == 1) update(r,1);
}
else {
int l = max(0,num - 3);
int r = min(m + 1,num + 3);
if(b[l]) b[l] --;
if(b[r]) b[r] --;
//如果是最后一次就减减
if(b[l] == 0) update(l,-1);
if(b[r] == 0) update(r,-1);
}
cout << query(m) << endl;
}
}
int main()
{
int t;
//cin >> t;
t = 1;
while(t --) solve();
return 0;
}
Map 卧槽了,我居然练map都忘了,呜呜呜
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
int m,q;
void solve()
{
cin >> m >> q;
map<int,int> p;
while(q --){
int op,num;
cin >> op >> num;
if(op == 1){
int l = num - 3;
int r = num + 3;
if(l >= 1) p[l] ++;
if(r <= m) p[r] ++;
}
else {
int l = num - 3;
int r = num + 3;
if(l >= 1) p[l] --;
if(r <= m) p[r] --;
if(p[l] == 0) p.erase(l);
if(p[r] == 0) p.erase(r);
}
cout << p.size() << endl;
}
}
int main()
{
int t;
//cin >> t;
t = 1;
while(t --) solve();
return 0;
}
C 枚举
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const double eps = 1e-6;
void solve()
{
double a,b,c;
cin >> a >> b >> c;
double S = a * c / 2;
//俩边循环;
for(double i = 0;i <= b;i ++){
double s = c * i * i / b;
if(fabs(S - s) < eps){
puts("YES");
return;
}
}
for(int i = b;i <= a;i ++){
double s = c * (a - i) * (a - i) / (a - b);
if(fabs(S - s)< eps){
puts("YES");
return;
}
}
puts("NO");
}
int main()
{
int t;
cin >> t;
//t = 1;
while(t --) solve();
return 0;
}
E DP
期望就是 概率乘以发生的事情的结果 的总和;
在哪一天购买只能对他的后面的天数进行影响
dp[i] 表示 从第i天开始购买到第n天;
dp[i] = 0.5 * min(dp[i +1],a[i]) + 0.5 * min(dp[i +1],b[i]);
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 1e5 + 5;
double dp[N];
double a[N],b[N];
void solve()
{
int n;
cin >> n;
for(int i = 1;i <= n;i ++) cin >> a[i];
for(int j = 1;j <= n;j ++) cin >> b[j];
dp[n + 1] = 0x3f3f3f3f;
for(int i = n;i >= 1;i --)
dp[i] = 0.5 * min(a[i],dp[i + 1]) + 0.5 * min(b[i],dp[i + 1]);
printf("%.10f\n",dp[1]);
}
int main()
{
int t;
cin >> t;
//t = 1;
while(t --) solve();
return 0;
}