Loading

Codeforces Contest 1715

Only have C ~ F.

C. Monoblock

先考虑算出修改前的答案。这明显可以增量法 \(O(n)\)。修改的时候先考虑把这里断开,然后再考虑和左右两边连上(大概三种情况,随便讨论)

D. 2+ doors

完了,口胡假了。

显然这个东西可以按位考虑,然后变成01,只用写个2-sat就完事了。

E. Long Way Home

看到 \(k\) 只有 \(20\) 容易想到去分层,对于每一层,我们把dis排序然后跑斜率优化dp,然后再跑dijkstra得到下一层的初始值。复杂度 \(O(nk\log n)\)

F. Crop Squares

是看了一眼hint就会的傻逼题。把矩形用锯齿状隔开,也就是比如把任意一个x长度为1的小矩形分成从对角线隔开。这时相交的距离就和x坐标无关了,于是可以得出y坐标。同理可以得出x坐标。所以这道题其实只用两次询问。

#include<bits/stdc++.h>
#define D double
using namespace std;
int n,m;
D ask(vector<pair<D,D>>vec){
    printf("? %d\n",vec.size());
    for(auto x:vec)
        printf("%.10lf %.10lf\n",x.first,x.second);
    fflush(stdout);
    D ret;
    scanf("%lf",&ret);
    return ret;
}
int main(){
    scanf("%d%d",&n,&m);
    vector<pair<D,D>>vec;
    pair<D,D>ans;
    vec.clear();
    vec.push_back(make_pair(0,m+1));
    for(int i=0;i<n;i++)
        vec.push_back(make_pair(i,0)),vec.push_back(make_pair(i+1,m));
    vec.push_back(make_pair(n,m+1));
    ans.second=ask(vec)*m-0.5;
    vec.clear();
    vec.push_back(make_pair(n+1,0));
    for(int i=0;i<m;i++)
        vec.push_back(make_pair(0,i)),vec.push_back(make_pair(n,i+1));
    vec.push_back(make_pair(n+1,m));
    ans.first=ask(vec)*n-0.5;
    printf("! %.10lf %.10lf\n",ans.first,ans.second);
    return 0;
}
posted @ 2022-08-22 09:24  Semsue  阅读(44)  评论(0编辑  收藏  举报
Title