CF div3 587
2310 ワード
C
反発原理は、白い面積から2つの黒と白が交差する面積を減らし、黒と白黒が交差する面積を加える.
初めて黒交差の面積を減らしたが、WAは11番目の点に着いて、黒交差の面積が白の面積内ではない可能性があることを発見した.
だから白黒の面積を一緒に交差させ、減らします.やっとAになった.
2つの長方形の面積が交差し、左の最大点、右の最小点、上の最小点、下の最大点を選択できます.
n個の矩形面積を交差させ、n個の矩形のうち左が最大の点、右が最小の点、上が最小の点、下が最大の点を選択する.
E1
原題POJ 1019、問題は同じで、構想も同じです.
CF ACランキングで大物の書き方が超簡単なのを見て、勉強しました.
各サブセグメントを1で始まるシーケンスに分割し、1,121231234123455
このように、(tmp)は1からずっと増加するstringシーケンスであり、(st)は前にスキップしたサブセグメントを表す
目的は$st+tmpです.size()geq k$,このとき(stleq kleq tmp.size())について説明します.
stは各サブセグメントの先頭の1の下付き文字を記録しているので、
では、(k-st)で表します.(k)は(tmp)のセグメントの下付き位置です.stringは0からカウントされるので、(k--)
反発原理は、白い面積から2つの黒と白が交差する面積を減らし、黒と白黒が交差する面積を加える.
初めて黒交差の面積を減らしたが、WAは11番目の点に着いて、黒交差の面積が白の面積内ではない可能性があることを発見した.
だから白黒の面積を一緒に交差させ、減らします.やっとAになった.
2つの長方形の面積が交差し、左の最大点、右の最小点、上の最小点、下の最大点を選択できます.
n個の矩形面積を交差させ、n個の矩形のうち左が最大の点、右が最小の点、上が最小の点、下が最大の点を選択する.
#include
using namespace std;
const double eps = 1e-5;
typedef long long ll;
struct Point{
ll x[5],y[5];
}p[4];
ll calc(Point a,Point b){
ll lx = max(a.x[1],b.x[1]),rx = min(a.x[2],b.x[2]),
dy = max(a.y[1],b.y[1]),uy = min(a.y[2],b.y[2]);
if(lx < rx && dy < uy){
return (rx - lx) * (uy - dy);
}
else return 0;
}
ll f(Point a,Point b,Point c){
ll lx = max(a.x[1],max(b.x[1],c.x[1])),rx = min(a.x[2],min(b.x[2],c.x[2])),
dy = max(a.y[1],max(b.y[1],c.y[1])),uy = min(a.y[2],min(b.y[2],c.y[2]));
if(lx < rx && dy < uy){
return (rx - lx) * (uy - dy);
}
else return 0;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
for(int i = 1;i <= 3; ++i){
cin >> p[i].x[1]>>p[i].y[1]>>p[i].x[2]>>p[i].y[2];
}
ll c13 = calc(p[1],p[3]),c12 = calc(p[1],p[2]),c23 = f(p[1],p[2],p[3]),
W = (p[1].x[2] - p[1].x[1]) * (p[1].y[2] - p[1].y[1]);
ll m = (c13 + c12 - c23);
if(W > m) cout << "YES";
else cout << "NO";
return 0;
}
E1
原題POJ 1019、問題は同じで、構想も同じです.
CF ACランキングで大物の書き方が超簡単なのを見て、勉強しました.
各サブセグメントを1で始まるシーケンスに分割し、1,121231234123455
このように、(tmp)は1からずっと増加するstringシーケンスであり、(st)は前にスキップしたサブセグメントを表す
目的は$st+tmpです.size()geq k$,このとき(stleq kleq tmp.size())について説明します.
stは各サブセグメントの先頭の1の下付き文字を記録しているので、
では、(k-st)で表します.(k)は(tmp)のセグメントの下付き位置です.stringは0からカウントされるので、(k--)
#include
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int q,k;
cin >> q;
while(q--){
cin >> k;
string tmp = "1";
int num = 1,st = 0;
while(st + tmp.size() < k){
st += tmp.size();
num++;
tmp += to_string(num);
}
if(st) k -= st;
k--;
cout << tmp[k] << endl;
}
return 0;
}